如果我发布的变量超过应有的数量,那会有问题吗?我无法提前确定保留计数。
答案 0 :(得分:2)
保留计数应更多地考虑理论偏差。你永远不应该关心目前的价值,你的行为将如何抵消它。例如,将对象添加到数组时,已将其保留计数偏移+1,并且从数组中删除对象时,将其保留计数偏移-1。当你完全使用一个对象时,它的保留计数偏移量(相对于你)应为0.它的保留计数实际是什么并不重要,只要你履行管理适当地反对。
明确地检查保留计数通常不会显示您的期望。这可能是因为引擎盖下的优化。 Cocoa依赖于符合memory management guidelines的开发人员。遵循这些非常简单的规则,不要担心retainCount
的显式值。
过度释放对象(发送过多的释放消息)可能 - 并且通常会导致该对象过早释放。任何发送到解除分配对象的地址的消息通常都会导致应用程序崩溃。愚蠢的经验法则是:
发送alloc
,new
,retain
,copy
(或名称中包含copy
的任何方法)都会为您提供一个对象保留计数偏移+1。
发送release
将抵消对象保留计数-1。
将每个+1与-1平衡,就是这样!
如果您正在开发框架或库,并且要将对象返回给框架的用户,请不要试图通过过度保留对象来防止代码中的错误。他们的义务与你的义务完全相同,如果他们从糟糕的内存管理中破坏你的框架那么这就是他们的代码中的错误,而不是你的。
答案 1 :(得分:1)
不要担心retainCount
。仅将发布发送到您拥有的对象。如果您通过向类发送alloc
来获取对象,或者向对象发送retain
,copy
或mutableCopy
消息,那么您拥有该对象并负责发送在将来的某个时间发出release
消息。
所有这些都在Memory Management Guide中解释。
答案 2 :(得分:0)
请请不要过度释放物体。
在开发应用时,最好设置环境变量
MallocScribble = “YES”
这会立即将free'd对象的指针覆盖到0x555,这样你就可以在之前不会崩溃。也打破了obj-c异常!启用这两项设置有助于提高应用效果。