【问题标题】:Alloc a new objective C object to a retained property?将新的目标 C 对象分配给保留属性?
【发布时间】:2012-06-21 23:52:15
【问题描述】:

很抱歉问了一个完全基本的问题,但如果我有一个保留的合成属性。

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

会导致内存泄漏吗?

所以我认为我需要这样做是正确的

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

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

【问题讨论】:

    标签: objective-c memory-management retaincount alloc


    【解决方案1】:

    启用 ARC 后,xcode 将处理所有内存管理。 当不使用 ARC 时,一定要在 dealloc 方法中释放它。

    【讨论】:

    • 所以我想我不需要在 alloc 之后释放。谢谢。
    • 你应该在dealloc中释放它,而不是dealloc。一般来说,你永远不应该自己调用 dealloc,当你当前正在释放某些东西时,值得注意的例外是 [super dealloc]。
    • 如果进行手动内存管理,通常会删除 dealloc 方法中的所有对象。那里有一些苹果的文件,我真的很推荐!!尤其是“所有权的转移”,真的是你应该知道的。
    【解决方案2】:

    Here is a thread,您会觉得很有帮助。

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

    你也可以这样做:

    self.myProperty = nil;
    

    来自docs:

    保留

    指定应在对象上调用保留 任务。

    先前的值被发送释放消息。

    【讨论】:

    • self.myProperty = nil 并没有解决这个问题——它只会撤消属性本身所做的保留,使来自alloc 的保留悬而未决,无法释放它。
    • @walkytalky 当你调用 self.myProperty = nil 时,[myProperty release] 是从合成的 setter 调用的,那么为什么会留下任何额外的悬空而不是调用 [myProperty release]?
    • 重读问题。问题是alloc 授予的不平衡所有权留置权。调用[myProperty release] 释放that,而不重置属性值。则该属性的所有权语义是正确的。
    【解决方案3】:

    标准做法是在这种情况下使用autorelease。所以:

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

    这是因为init 返回了一个保留对象,并且由于您的属性也保留了它,因此您必须释放它。

    编辑添加:@walkytalky 在 cmets 中提出了一个很好的观点,即实际上是 alloc 保留了对象,init 只是返回它。

    【讨论】:

    • 请注意,从概念上讲,保留来自alloc。当然,由于init随后返回了对象,所以你说的也是如此。事实上,init 可能会返回一个不同的保留对象,但传统仍然将保留与分配而不是初始化相关联(如旧的 NARC 规则)。
    【解决方案4】:

    另一种(更详细的)技术是:

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

    不过,就我个人而言,我可能只使用上面第一个示例中的 autorelease。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多