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)
释放对象,通过实例变量访问它foo.实例变量将成为悬空指针.这是dealloc中的首选方法.
分配给nil自己的财产bar,实际上将释放当前保留的财产.如果你有一个属性的自定义setter,那么这样做,应该清理不仅仅是支持属性的实例变量.
将baz使用nil 覆盖引用该对象的指针,但不释放该对象.结果是内存泄漏.永远不要这样做.
如果您没有使用属性(其中self.property = nil也将释放一个对象),那么您应该始终按照设置引用的代码关注nil,如您所述:
[view release]; view = nil;
Run Code Online (Sandbox Code Playgroud)
原因是它避免了可能使用无效的引用的可能性.它很少发生,也很难发生,但它可能会发生.
这在viewDidUnload中更为重要,如果你正在释放IBOutlets - 这是一个更现实的场景,其中引用可能因为内存警告卸载视图而变坏,然后视图中的一些其他代码试图在使用之前使用引用视图重新加载.
基本上这只是一个很好的练习,如果你习惯这样做,它会在某些时候让你失败.