为什么在使用属性访问器时调用我的retain方法

时间:2011-08-10 21:48:22

标签: iphone objective-c cocoa-touch

我的对象没有从内存中释放出来,所以我重写了retain方法并设置了一个断点来查看代码保留在哪里。

每次使用属性访问器引用对象时,都会调用retain方法。为什么会发生这种情况?

color = self.myobject.color

呼叫保留。

2 个答案:

答案 0 :(得分:7)

保留属性的合成属性访问器如下所示:

- (UIColor *)color
{
    return [[_color retain] autorelease];
}

因此,您调用了retain方法,但它与autorelease平衡。

请参阅Objective-C编程语言指南中的this code snippet,了解合成访问器的外观示例(锁定部分不适用于非原子的情况,但retain-autorelease是相同的)。

答案 1 :(得分:2)

因为您可能将您的财产声明为retaincopy

@property (nonatomic, retain) MyObject* myobject;

如果 @synthesize ,编译器将生成看起来或多或少的代码:

- (void) setMyobject: (MyObject *) value
{
    if (value != myobject)
    {
        [myobject release];
        myobject = value;
    }
}

每次分配给self.myobject时,都会使用新对象作为value参数调用该方法。它应该释放旧对象,但保留最后添加的对象。你必须在你的dealloc中释放它。你应该释放你分配的内容,所以模式是:

MyObject *myObj = [[MyObject alloc] init];
self.myobject = myObj;
[myObj release];

从方法返回的项目通常是自动释放的,因此您不应该释放它们:

MyObject *myObj = [someOtherObject someMethod: 17];
self.myobject = myObj;
// Do NOT release myObj!

更新

请参阅 @omz 的解释。我误读并且正在谈论 setter 。您的 getter 也会保留,但会立即与 autorelease 配对。由于您只记录保留,因此只有看起来,就像您有泄漏一样。