启用 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”消息?
最佳答案
基础集合类,例如 NSArray
、NSDictionary
等,保留(或者在 ARC 中具有强引用)它们所包含的对象。因此,只要数组尚未被释放,它引用的对象(包括 View 实例)就应该仍然在内存中。
听起来好像您之前没有在 Controller 的 dealloc
方法中将属性设置为 nil
,从而泄漏了数组。当对象将属性声明为 strong
时,它负责在其 dealloc
实现中清空引用,以避免这种泄漏。
关于iphone - ARC奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10818720/