将保留/强类成员variables自动清理卸载视图控制器?
我有以下属性
。H
@property (nonatomic, strong) NSMutableDictionary *cache;
.M
@synthesize cache = _cache;
_cache
的数据build立在viewDidLoad上。 现在我想知道,一旦视图控制器被卸载,_cache是否会被自动清理,或者我必须明确地做一个_cache = nil;
在viewWillUnload
?
无论您是否使用ARC,它们都不会在-viewDidUnload
中-viewDidUnload
。 你必须明确地释放它们(或者在ARC下将它们设置nil
)。
最简洁的答案是不。 实例variables不会被自动释放。 它不会导致视图控制器上的dealloc。 被控制的视图被清除。
任何你想清除的,必须在viewDidUnload中明确地完成(注意通过IB添加的variables将被自动放置在该方法中)。
viewDidUnload的典型场景是由控制器pipe理的视图不再在屏幕上(例如,另一个控制器已经用导航控制器推送)。 系统检测到内存压力,并且您的视图已被卸载。
任何对你视图中对象的弱引用都会被自动清除(只要你没有对它们进行额外的强引用)。 在viewDidUnload中,当屏幕上显示视图时,您不需要对可以重新加载的数据的强引用。
执行viewDidUnload和dealloc不一样。 如果您正在pipe理必须发布的资源(或通过KVO或通知中心注册),那么您也需要这样做。 请注意,在这些情况下,您将不得不在viewDidUnload和dealloc(在适当情况下)都执行它们。
无法回答ARC,但viewdidUnload并不意味着VC被释放。 这意味着这个观点正在被释放。 强制它,你可以尝试有一个导航控制器,推几个意见,并在模拟器发送一些内存警告。 viewDidUnload将被调用的不是最高的那个vcs。
回复:ARC,你可以肯定有一个dealloc方法,当vc被释放时会被调用。 根本不要叫超级。
你可以加:
-(void)dealloc { // If you are using ARC remove the line below [super dealloc] }
并放置一个断点,它会告诉你什么时候被释放。 dealloc方法也会被ARC调用,只要确保你不要在ARC中调用[super dealloc]。