【问题标题】:iOS correct way (memory management) for a method to return a valueiOS 正确方法(内存管理)对于一个方法返回一个值
【发布时间】:2011-07-01 10:53:01
【问题描述】:

如果我有一个名为 Foo 的类并且我有这个函数 + getIds 应该返回 ids。 + getIds 的正确签名会是这样吗:

+ (NSArray *)getIds {

    NSMutableArray *ids = [[[NSMutableArray alloc] init] autorelease];

    return ids;
}

我想知道是否应该在*ids 上使用自动释放?我假设没有其他方法吗?我不能在 return 语句之后做[ids release] 对吗?

【问题讨论】:

    标签: iphone objective-c ios cocoa-touch memory-management


    【解决方案1】:

    您可以将 autorelease 消息与 alloc, init 消息一起发送。你也可以这样做,return [ids autorelease]; 注意:你不应该同时做这两个 ;-)

    你不能返回[id release],因为release方法本身什么都不返回。

    【讨论】:

    • 好的。但是是否可以在方法中而不是使用自动释放到[ids retain],然后再调用方法NSArray *ids = [Foo getIds]; // Do something with ids // [ids release];
    • @Peter Warbo,没有。最好的方法是 autorelease idsgetIds 方法中,你应该 retain 调用该方法的返回值,比如, NSArray *ids = [[Foo getIds] retain];
    • 如果我不按照您的建议保留它会发生什么?我自己想通了。如果我调用它,那么我将负责稍后释放该对象。否则将由autorelease 处理
    • @Peter Warbo,没错。干杯!
    【解决方案2】:

    返回对象的典型正确内存管理是让被调用的方法将其设置为自动释放对象,除了,当方法名称包含“copy”、“new”或“alloc”时。在这些情况下(copy/new/alloc),返回的对象被保留,调用者拥有它(即调用者负责确保它们被释放)。

    您在问题中编写的代码将执行正确的操作 - 它将返回一个自动释放的对象。

    当调用者返回NSArray时,他们可以随意使用该对象,如果在以后的调用中不需要该对象,那么他们不需要做任何额外的内存管理。在运行循环结束时,NSArray 将被释放,这是所需的行为。如果调用者确实需要对象的寿命更长,那么他们必须对它调用retain(或与之等效的东西,例如调用其他调用retain的东西),然后他们采取有责任稍后发布。

    有用的东西:

    此外,当 ARC(iOS 5 中的自动引用计数)成为常态时,这一切都会消失。

    【讨论】:

      【解决方案3】:

      正在自动释放数组,因此第二次调用autorelease 将是一个可能导致崩溃的错误。您不能在返回后执行release(那时您已经离开该函数)这一事实是autorelease 存在的原因之一。

      关于方法是否应该返回自动释放对象而不是保留对象:只有以allocnew 开头或包含copy(如mutableCopy)的方法应返回保留对象。所有其他方法应返回自动释放的对象。

      【讨论】:

      • 我知道。我想知道的是,如果我可以在不自动释放它的情况下以任何其他方式返回值(例如[ids release]
      • 但是NSMutableArray 被发送alloc 消息。那我不应该可以使用retain吗?
      • 不,您的方法需要返回一个自动释放的对象,即 relative 保留计数为 0 的对象。您首先分配它 (+1),现在您需要自动释放它(-1)。换句话说:你必须确保数组被清理,即使调用者不使用数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2016-12-27
      • 2018-09-18
      • 2019-03-29
      • 1970-01-01
      相关资源
      最近更新 更多