【问题标题】:Do I have to release object in Objective-C [duplicate]我是否必须在 Objective-C 中释放对象 [重复]
【发布时间】:2012-11-21 01:25:46
【问题描述】:

可能重复:
Understanding reference counting with Cocoa and Objective-C

我对内存泄漏有点困惑——什么时候我必须释放对象,什么时候它会在 iOS 中自动释放,所以请使用以下代码帮助我理解。 我有以下 while 块的一种方法:

-(void) oneMethod {
    NSMutableArray *returnValue = [[[NSMutableArray alloc] init] autorelease];

    while(true) { 
    ...
     MyObject *myObj = [[MyObject alloc] initWithFrequency:100];

    [returnValue addObject:myObj];

    [myObj release];
    ...
    }
}
  1. 我是否必须调用 [myObj release] 或者它会在每个循环中自动释放?
  2. 另外,我是否必须将 autorelease 放在 NSMutableArray 的 init 调用中,或者从方法返回后它会立即自动释放?

谢谢!

【问题讨论】:

标签: objective-c memory-leaks release


【解决方案1】:

越早,我学到的东西就越好。您的示例是在插入数组后适当地释放每个 myObj 变量。数组现在“拥有”对象,只要数组存在,对象就会存在,没有理由保留变量引用。

ARC 似乎确实让这一切变得完全没有必要。我不知道有多少开发人员会在不久的将来学习这个概念,因为现在 ARC 会为你做这一切。

假设您没有使用 ARC,因此,如果您没有调用 [myObj release],则每次循环都会导致泄漏。

【讨论】:

  • 几个月前我开始在 iOS 上编程,使用旧的 xcode 4.0.2 阅读(显然)旧书。其实我不知道,也没有想到新旧xcode之间可能存在巨大差异。因此,在阅读“较旧”的书籍时,作者们让我害怕内存泄漏,我必须对此非常小心,不要忘记发布一些东西......现在我用 ARC 阅读,你不必这么想很多关于它。我认为我需要一些时间才能足够勇敢并忘记释放对象 :-) 谢谢你,艾伦
【解决方案2】:

您的代码是正确的。

我发现随着您使用它的工作越多,您就会习惯它。我不会花太多时间去想它。

通常,您需要发布您所做的所有内容(或自动发布)。

您的循环编码正确,因为它易于记忆,即使对于大型数组也是如此。

【讨论】:

    【解决方案3】:

    您应该使用ARC - Automatic Reference Counting,然后您不必担心释放分配的对象。

    【讨论】:

    • 谢谢亚当和汤姆。所以它不像在 C 中,如果我退出某个块 {...code...} 它会自动释放该块中的对象。如果我记得的话,ARC 是在新的 Xcode 4.x 中引入的——如果我手动释放对象并同时使用 ARC 会怎样——它会产生某种错误,或者它也是允许的?
    • 如果你在使用ARC的项目中尝试release,编译器会报错。
    • 据我所知,release 和 retain 在启用 ARC 的项目中不是有效的方法。
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多