ARC奇怪的行为

时间:2012-05-30 14:49:15

标签: iphone objective-c ios automatic-ref-counting

启用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");
}

当我弹出我的视图控制器时,这不会被调用。但是如果我在视图控制器的dealloc中找到了arr变量,我会看到日志消息,表明搜索视图已被删除。

任何人都可以解释一下arr中的对象是如何被释放的,尽管视图控制器100%被释放,因为我在dealloc中有“dealloc”消息?

1 个答案:

答案 0 :(得分:1)

NSArrayNSDictionary等基础集合类保留(或者在ARC中强烈引用它们包含的对象)。因此,只要数组尚未解除分配,它引用的对象(包括视图实例)应该仍然在内存中。

听起来好像你之前没有通过在控制器的nil方法中将属性设置为dealloc来泄漏数组。当一个对象将属性声明为strong时,它负责在dealloc实现中对引用进行nilling以避免这种泄漏。