iPhone - dealloc - 发布与零

bbu*_*s21 24 memory iphone memory-management release-management dealloc

想知道有经验的人是否可以解释这一点.我见过......的例子

  [view release];

  view = nil;  
Run Code Online (Sandbox Code Playgroud)

....在(void)dealloc里面.

有什么区别,哪一个比另一个更好?什么是最好的方法?

在进行retainCount测试时,我个人已经看到nil为我减少了3到0的计数,但是只发布从3减少到2.

Pey*_*loW 36

你看到的可能是这些:

1) [foo release];
2) self.bar = nil;
3) baz = nil;
Run Code Online (Sandbox Code Playgroud)
  1. 释放对象,通过实例变量访问它foo.实例变量将成为悬空指针.这是dealloc中的首选方法.

  2. 分配给nil自己的财产bar,实际上将释放当前保留的财产.如果你有一个属性的自定义setter,那么这样做,应该清理不仅仅是支持属性的实例变量.

  3. baz使用nil 覆盖引用该对象的指针,但不释放该对象.结果是内存泄漏.永远不要这样做.

  • 使用2)可能是危险的,这就是为什么1)是首选的原因.如果setter被子类覆盖,则现在在已经调用了`dealloc`方法的子类中调用了一个方法.安全属性/ ivar访问的一般规则是:1)直接在`init`,`dealloc`和setter/getters中使用ivar.2)所有其他访问权应通过酒店进行. (8认同)
  • @AlBlue:不,它不会导致内存泄漏.使用retain或copy将具有相同的语义os,释放属性引用的先前对象.唯一的区别是如何获得新价值; 'ivar = [newValue retain];`vs`ivar = [newValue copy]`.两者都会用简单的`[ivar release]`释放旧值. (6认同)

Ken*_*ner 8

如果您没有使用属性(其中self.property = nil也将释放一个对象),那么您应该始终按照设置引用的代码关注nil,如您所述:

[view release]; view = nil;
Run Code Online (Sandbox Code Playgroud)

原因是它避免了可能使用无效的引用的可能性.它很少发生,也很难发生,但它可能会发生.

这在viewDidUnload中更为重要,如果你正在释放IBOutlets - 这是一个更现实的场景,其中引用可能因为内存警告卸载视图而变坏,然后视图中的一些其他代码试图在使用之前使用引用视图重新加载.

基本上这只是一个很好的练习,如果你习惯这样做,它会在某些时候让你失败.