我的对象没有从内存中释放出来,所以我重写了retain方法并设置了一个断点来查看代码保留在哪里。
每次使用属性访问器引用对象时,都会调用retain方法。为什么会发生这种情况?
color = self.myobject.color
呼叫保留。
答案 0 :(得分:7)
保留属性的合成属性访问器如下所示:
- (UIColor *)color
{
return [[_color retain] autorelease];
}
因此,您调用了retain
方法,但它与autorelease
平衡。
请参阅Objective-C编程语言指南中的this code snippet,了解合成访问器的外观示例(锁定部分不适用于非原子的情况,但retain-autorelease是相同的)。
答案 1 :(得分:2)
因为您可能将您的财产声明为retain
或copy
:
@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 配对。由于您只记录保留,因此只有看起来,就像您有泄漏一样。