iphone - ARC奇怪的行为

标签 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];

在我的搜索 View 中,我已覆盖 dealloc方法,因为搜索 View 似乎没有被释放:

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

当我弹出 View Controller 时,这不会被调用。但是如果我将 View Controller 的 dealloc 中的 arr 变量设为 nil我看到搜索 View 已被删除的日志消息。

谁能解释一下 arr 内的对象怎么可能?尽管 View Controller 已 100% 释放,但尚未释放,因为我在其 dealloc 中有“did dealloc”消息?

最佳答案

基础集合类,例如 NSArrayNSDictionary 等,保留(或者在 ARC 中具有强引用)它们所包含的对象。因此,只要数组尚未被释放,它引用的对象(包括 View 实例)就应该仍然在内存中。

听起来好像您之前没有在 Controller 的 dealloc 方法中将属性设置为 nil ,从而泄漏了数组。当对象将属性声明为 strong 时,它负责在其 dealloc 实现中清空引用,以避免这种泄漏。

关于iphone - ARC奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10818720/

相关文章:

iphone - 无法在 tableviewcell ios 7 上显示删除按钮

ios - animateWithDuration 在 GMSMapView 委托(delegate)方法中不起作用

android - 实现用户帐户激活的最佳方法是什么?

针对 iPad 及更低版本的 Safari(仅)的 Css 媒体查询

iphone - 不再需要 Flurry Analytics 和 Flurry AppCircle?

iphone - 如何将 touchesEnded 转移到由 touchesBegan 在不同的 UIView 上添加的 UIView?

ios - IOS中点击按钮时如何改变按钮的图像?

ios - Objective C - 使用共享实例创建单例

ios - 如何扩展为高度为 2 :1? 的标签

iphone - 启动远程程序时出错 : failed to get the task for process 3595