【问题标题】:releasing object after return返回后释放对象
【发布时间】:2010-06-19 17:20:17
【问题描述】:

我使用一个对象来获取一些值并返回这些值。 将返回的值仍在此对象中。 代码如下:

    XMLErrorParser *xmlErrorParser = [XMLErrorParser alloc];
    [xmlErrorParser parseData: data];
    return xmlErrorParser.errors;

那么我怎样才能释放 xmlErrorParser 对象并返回它的值呢? 谢谢。

【问题讨论】:

  • +alloc 始终需要-init。如果你不这样做,你的代码将会以一种很难调试的方式中断。

标签: ios objective-c iphone memory-management


【解决方案1】:

只需返回 errors 持有的对象的自动发布版本。

在没有提供更多关于XMLErrorParser 是什么的细节的情况下,让我们假设errors 拥有一些NSArray

XMLErrorParser *xmlErrorParser = [[XMLErrorParser alloc] init];
[xmlErrorParser parseData: data];
NSArray *errors = [[xmlErrorParser.errors retain] autorelease];
[xmlErrorParser release];
return errors;

(请注意,您错过了错误解析器对象的初始化。)

【讨论】:

  • +1 这里最干净的解决方案,因为您只保留/自动释放您需要的数据。
  • 另一方面,您使用的代码多 2 行 + 您的示例比其他示例更易读。
【解决方案2】:
XMLErrorParser *xmlErrorParser = [[XMLErrorParser alloc] init];
[xmlErrorParser parseData: data];
return [xmlErrorParser autorelease].errors;

或更好

XMLErrorParser *xmlErrorParser = [[[XMLErrorParser alloc] init] autorelease];
[xmlErrorParser parseData: data];
return xmlErrorParser.errors;

【讨论】:

    【解决方案3】:

    这就是autorelease 的用途(会不会是你忘记了init?):

    XMLErrorParser *xmlErrorParser = [[[XMLErrorParser alloc] init] autorelease];
    [xmlErrorParser parseData: data];
    return xmlErrorParser.errors;
    

    阅读Memory Management Guide for Cocoa


    根据您方法的目的,您可能还必须保留xmlErrorParser.errors

    【讨论】:

    • xmlErrorParser 可能已经被自动释放。我认为 Apple 自己的访问器可以做到这一点。
    • @Georg:为什么它应该已经自动发布了?它是显式分配和初始化的。如果以这种方式创建对象,则不会自动释放对象。
    【解决方案4】:

    我认为 parseData 是您的初始化程序,在这种情况下,您可以使用 autorelease 消息让最里面的自动释放池知道您不再需要该对象。

    例子:

    XMLErrorParser *xmlErrorParser = [XMLErrorParser alloc];
    [[xmlErrorParser parseData: data] autorelease];
    return xmlErrorParser.errors;
    

    我建议您也明确保留errors 属性,否则您可能会忘记它。经验法则,释放和自动释放调用必须匹配保留的数量才能释放对象。

    【讨论】:

    • init 丢失和自动释放什么?!
    • 我提到我假设 parseData 是他的初始化器,这意味着它返回一个 id 类型,更具体地说是它初始化的新对象,使这段代码有效。请在下次发送垃圾邮件/举报之前通读几遍。
    【解决方案5】:

    - autorelease怎么样?

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2010-12-11
      • 2011-06-23
      相关资源
      最近更新 更多