0

我很难理解这种情况。

  • 我创建一个对象
  • 我将其保留属性设置为
  • 我忘记释放它的财产
  • 我释放对象

由于我没有在dealloc方法中释放该属性,那么该场景会导致内存泄漏还是会自动释放该属性?

4

2 回答 2

0

Cocoa 的工作方式是内存管理在任何一种方法中总是看起来是局部平衡的*。这是重点。您应该能够仅通过查看一种方法来判断该方法是否存在泄漏或错误。无需全球计划知识。

如果您从 -copy、-alloc、-retain 或 -new 方法收到对象,则您有责任释放该对象。

如果你这样做:

[obj setProp:foo];

释放 foo 是你的责任吗?否 - 请参阅规则。如果 obj 保留它(并且您说您碰巧知道它确实存在),那么 obj 有责任在其 dealloc 方法中释放它,如果不是更早的话。

所以如果你这样做,它是平衡的,不管是什么属性-prop

id obj = [[MyObject alloc] init];
[obj setProp:foo];
[obj release];

*除了在 init、copy、dealloc 和 accessor 方法的实现中。

于 2010-04-07T09:07:23.793 回答
-1

是的,是泄漏。

保留,分配将计数器加一。释放将减少计数器。当计数器达到零时,它将释放内存。

把 setter 想象成这样:

[newvalue retain];
[property release]; 
property = newvalue;

所以..

  • 创建一个对象 => 0+1=1
  • 将其作为保留属性分配给某个对象 => 1+1=2
  • 释放对象 => 2-1=1

您将不得不在某个时候再次释放该对象。而且,相信我autorelease在 iphone 环境中运行得不太好。

于 2010-04-07T07:36:39.977 回答