Objective c 是否将新的目标C对象分配给保留的属性?

Objective c 是否将新的目标C对象分配给保留的属性?,objective-c,memory-management,retaincount,alloc,Objective C,Memory Management,Retaincount,Alloc,很抱歉问了一个非常基本的问题,但是如果我有一个保留的合成属性 self.myProperty = [[NSObject alloc] init]; 会导致内存泄漏吗 那么,我认为我需要做的事情是正确的吗 self.myProperty = [[NSObject alloc] init]; [self.myProperty release]; 为了平衡?因为这看起来很愚蠢。启用ARC后,xcode将处理所有内存管理。 当不使用ARC时,请确保使用dealloc方法释放它。您会发现这很有用 你

很抱歉问了一个非常基本的问题,但是如果我有一个保留的合成属性

 self.myProperty = [[NSObject alloc] init];
会导致内存泄漏吗

那么,我认为我需要做的事情是正确的吗

self.myProperty = [[NSObject alloc] init];
[self.myProperty release];

为了平衡?因为这看起来很愚蠢。

启用ARC后,xcode将处理所有内存管理。 当不使用ARC时,请确保使用dealloc方法释放它。

您会发现这很有用

你说得对。如果没有ARC,任何保留的属性也需要释放

您还可以执行以下操作:

self.myProperty = nil;
从:

保留

指定在发生时应在对象上调用retain 任务

前一个值通过释放消息发送


标准做法是在这种情况下使用
自动释放。因此:

self.myProperty = [[[NSObject alloc] init] autorelease];
这是因为
init
返回一个保留的对象,并且由于您的属性也保留了它,所以您必须释放它

编辑添加:@walkytalky在评论中指出,实际上是
alloc
保留了对象,
init
只是返回它。

另一个(更详细的)技巧是:

NSObject *o = [[NSObject alloc] init]; //retain count 1
self.myProperty = o;                   //retain count 2
[o release];                           //retain count 1

但就我个人而言,我可能会像上面第一个例子那样使用自动释放。

所以我想我不需要在alloc之后释放。谢谢。你应该在dealloc中发布它,而不是dealloc。通常情况下,您不应该自己调用dealloc,当您当前正在解除某个对象的位置时,值得注意的例外是
[super dealloc]
。如果您执行手动内存管理,则通常会删除dealloc方法中的所有对象。有一些苹果的文档,我真的很推荐!!尤其是“所有权转让”确实是你应该知道的事情。
self.myProperty=nil
并不能解决这个问题——它只会撤消属性本身所做的保留,而让
alloc
中的一个挂起,无法释放。@walkytalky当你调用self.myProperty=nil时,[myProperty release]是从合成setter调用的,那么与调用[myProperty release]相比,为什么会留下任何额外的悬空?请重新阅读这个问题。问题在于
alloc
授予的不平衡的所有权留置权。调用
[myProperty release]
将释放该属性,而无需重置属性值。属性的所有权语义是正确的。请注意,从概念上讲,retain来自
alloc
。当然,由于
init
随后返回对象,因此您所说的也是正确的。实际上,在某些情况下,
init
返回不同的保留对象,但传统的做法是将保留与分配相关联,而不是与初始化相关联(如旧的NARC规则)。