1

ある時点でメソッドを呼び出すために ivar の 1 つが必要なビュー コントローラーがあります。ivar がその所有者への参照を保存することは許容されますか? これにより問題が発生する可能性はありますか? もしそうなら、より良い方法は?

// From MainViewController.h
#import <UIKit/UIKit.h>
#import "MyObject.h"

@interface MainViewController : UIViewController

@property (strong, nonatomic) MyObject *myObject;

@end

// From MyObject.h
#import <UIKit/UIKit.h>

@interface MyObject : NSObject

@property (strong, nonatomic) id myOwner;

@end
4

3 に答える 3

4

2 つのオブジェクトが相互に強い参照を持っている場合、retain ループが作成されます。そのため、ループを手動で中断しない限り (たとえば、必要に応じて viewWillDisappear で myObject プロパティを nil に設定するなど)、割り当てが解除されることはありません (したがって、メモリ リークが発生します)。

はるかに良い方法は、「子」オブジェクトがその「所有者」への弱い参照を持つため、保持ループがまったくないことです。

@interface MyObject : NSObject

@property (weak, nonatomic) id myOwner;

@end
于 2013-03-06T15:29:57.637 に答える
1

はい。ただし、プロパティ宣言を次のように変更することを検討してください。

@property ( weak, nonatomic ) id myOwner;

このようにして、リテイン サイクルの可能性を回避できます。

于 2013-03-06T15:30:20.397 に答える
0

ブロックもトリックを行うことができます。

于 2013-03-06T15:51:34.547 に答える