0

ARCを有効にすると、プロパティがあります

  @property (strong, nonatomic) NSMutableArray *arr;

私はそれを次のように割り当てます

  self.arr = [NSMutableArray array];

カスタム オブジェクト ERSearchView があり、それを割り当てて arr に追加します

  ERSearchView *SV = [[ERSearchView alloc] initWithDelegate:nil];
  [arr addObject:SV];

私の検索ビューでdeallocは、検索ビューが解放されていないように見えるため、メソッドをオーバーライドしました。

- (void)dealloc {
  self.delegate = nil;
  NSLog(@"deallocated search view");
}

ビューコントローラーをポップしても、これは呼び出されません。しかし、View Controller の arr 変数を nil するとdealloc、検索ビューが削除されたというログ メッセージが表示されます。

arr「dealloc」メッセージが含まれているため、ビューコントローラーが100%解放されているにもかかわらず、内部のオブジェクトが解放されない可能性があることを誰かが説明できますdeallocか?

4

1 に答える 1

1

NSArray、などの Foundation コレクション クラスNSDictionaryは、それらに含まれるオブジェクトを保持します (または、ARC で言えば、強い参照を持ちます)。そのため、配列の割り当てが解除されていない限り、ビュー インスタンスを含め、配列が参照するオブジェクトは引き続きメモリ内にあるはずです。

nilコントローラーのdeallocメソッドでプロパティをに設定しないことで、以前に配列をリークしていたかのように聞こえます。オブジェクトがプロパティを として宣言する場合、この種のリークを回避するためstrongに、その実装で参照を消去する責任があります。dealloc

于 2012-05-30T15:52:10.637 に答える