当对象的指针变为0或调用dealloc时,指向对象的指针是否会变为nil
?为什么或者为什么不?Objective-C中的内存管理和指针设置为零
回答
不,它不会,因为释放没有权力改变指针。它只能做到这一点是你通过指针到指针。
如果你想确保它设置为零,你必须自己动手。
有些人认为这是一个很好的做法,有些人认为这是浪费时间,因为你的代码应该被构造成在释放后(直到重新分配之前)不使用指针。我实际上倾向于后者阵营,但我可以明白为什么人们想要保护自己免于获得释放的内存(编程防御几乎不是一个坏主意)。
我不确定指针是否为零,或者它指向的是无效数据,但是它的良好编码约定在您释放它们之后将其指定为零。
+1这是很好的建议,特别是对实例和静态变量,垃圾收集,其中可能会意外积累的期望不会被回收到不必要的记忆力强的参考下更是如此。我认为有些人只是想要一个神奇的子弹解决方案,所以他们不必考虑这个问题。 – 2010-01-09 16:31:51
想到这情况:
void *p = malloc (100);
while (someCondition)
{
// do something with p
}
free (p);
// p is not set to NULL for you, it still points to where it always did
类似地,当一个Objective-C的对象被释放,任何指向该对象仍然指向它在哪里。当另一个对象被分配到相同的空间时(或者即使没有任何东西被分配到同一空间中),这会导致错误。
在正常的保留释放记忆模型下,没有。启用垃圾回收后,如果指针被声明为__weak
(对于Objective-C对象,默认值为__strong
),就会发生这种情况。垃圾收集器会在您处理时为您清零弱引用,这使得它们非常适合指向代理和半瞬态对象。另请参阅NSPointerArray,NSMapTable和NSHashTable以及他们对弱关系的支持。 (注:人们必须明白,弱引用不会阻止对象被垃圾收集;当没有强引用指向同一地址时,它将被清零。请参阅this document以获取此行为的简要摘要。)
有Objective-C垃圾收集有很多其他好处,如果可以的话,我衷心推荐使用它。 (它可以在OS X 10.5+上使用,但不能在iPhone OS上使用。)Snow Leopard中的性能改进最令人印象深刻,而且一开始它就已经很快成型了。
也就是说,@darren有一个好处:在释放其内容时,通常是很好的做法。如果你正在寻找避免指向过度释放对象的指针,最好的办法就是采用习惯于自己修改变量。它不会导致运行时间开销,并且它是可读的。更重要的是,将变量设置为零有助于垃圾收集系统最有效地工作,因为它指示可以安全回收的内存。该代码也可以在两种模式下完美工作。
不过,我一般不零出-dealloc
值,因为你正在修改的记忆即将被收回,如果代码的其他部分可能会出错,由于使用释放值,他们不应该使用释放对象来开始。 (这通常发生在一个对象没有正确保留另一个对象时,并且后者被释放,留下一个dangling pointer。)可能的例外情况可能包括分段拆卸,其中非零引用可能会导致dealloc本身出现问题,但这种类型的行为通常不会(也不应该)在销毁对象时发生。
- 1. 发布后设置指针为零吗?
- 2. Objective-C:设置传递指针为零
- 3. 指针是否始终设置为零?
- 4. CUDA内存管理/类问题指针
- 5. 循环和内存管理中的C++指针算术?
- 6. iPhone - EXC_BAD_ACCESS当设置零IBOutlet - 内存管理
- 7. 为指针/内存管理可可战略
- 8. 结构指针成员和内存管理
- 9. 函数指针和内存管理使用C
- 10. 设置在Objective-C的指针地址为零
- 11. 指向struct的指针数组中的指针,如果设置为NULL,是否分配内存?
- 12. C - 指针和内存
- 13. 自动C++内存/对象实例管理?聪明的指针?
- 14. 智能指针在智能指针管理数组内
- 15. 将指针设置为contenteditable
- 16. 设置stuct中的指针为null
- 17. 的malloc内存的指针的指针
- 18. 如何设置指向零位的指针?
- 19. Golang:将零字符串指针设置为空字符串
- 20. 指针内存管理误解w/objective-c
- 21. 指针指针的内存泄漏
- 22. 设置指定的索引为零
- 23. 无法将指针位置设置为C++中另一个指针位置的指针位置
- 24. C++中的原始指针管理
- 25. C# - 读写进程内存,指针和偏移Gamer服务器管理工具
- 26. MongoDB指南针 - 代理设置
- 27. QTableView和设置指针位置
- 28. IOS内存和内存管理
- 29. 在Objective-C中管理自动属性中的内存设置为(保留)
- 30. 空指针,内存分配和Valgrind的
我设置宏安全地释放指针并将其设置为'nil'。 – notnoop 2010-01-09 05:16:01
+1 FYI,使用垃圾回收时,'__weak'指针是“自我调零”。此外,使用宏来做到这一点可能容易出错,正如我在下面的答案中提到的那样。 – 2010-01-09 16:38:51
如果在释放时没有设置为零的引用,那么泄漏将无法告诉您存在内存泄漏 - 毕竟就泄漏而言,您拥有有效的引用,即使您认为引用不再有效(过度保留)。 – 2010-01-10 05:34:39