Objective-C中的内存管理和设置指向nil的指针

SVA*_*SVA 5 garbage-collection memory-management objective-c

指向对象的指针是否会nil在其计数变为0或调用dealloc时到达?为什么或者为什么不?

pax*_*blo 13

不,它不会,因为释放没有权力改变指针.它只能这样做是你传递指针指针.

如果你想确保它设置为零,你必须自己做.

有些人认为这是一种好的做法,有些人认为这是浪费时间,因为你的代码应该被构造成在重新分配后不使用指针(直到重新分配).

我实际上倾向于后一阵营,但我可以看到为什么人们想要保护自己免于获取释放的内存(防御性编程很少是一个坏主意).


Qui*_*lor 5

在正常的保留释放内存模型下,没有.启用垃圾收集后,如果指针被声明为__weak(对于Objective-C对象,默认值为__strong),则会发生这种情况.垃圾收集器在处理时会将弱引用清零,这使它们成为指向委托和半瞬态对象的理想选择.另请参阅NSPointerArray,NSMapTableNSHashTable以及它们对弱关系的支持.(注意:必须理解弱引用不会阻止对象被垃圾收集;当没有强引用指向同一地址时,它会被置零.请参阅此文档以获取此行为的简短摘要.)

Objective-C垃圾收集还有很多其他好处,如果可以,我衷心建议使用它.(它可以在OS X 10.5+上使用,但不能在iPhone OS上使用.)Snow Leopard中的性能改进最令人印象深刻,而且它开始时已经很快就被恶劣了.

话虽这么说,@ darren有一个很好的观点:在释放内容时,通常是自己的变量.如果你想避免悬挂指向过度释放物体的指针,你最好的选择就是养成自己习惯变量的习惯.它不会产生运行时开销,而且可读.更重要的是,将变量设置为nil有助于垃圾收集系统最有效地工作,因为它表示可以安全回收的内存.然后代码也将完美地在两种模式下工作.

但是,由于您正在修改的内存即将被回收,因此我通常不会将值-dealloc清零,如果代码的某些其他部分由于使用已释放的值而可能会遇到错误,则它们不应使用已释放的值对象开始.(这通常发生在一个对象没有正确保留另一个对象时,后者被解除分配,留下一个悬空指针.)可能的例外情况可能包括分段拆除,其中非零引用可能会在dealloc本身内引起问题,但这行为类型通常不会(并且不应该)在销毁对象时发生.