如果函数创建并返回一个对象,它是否应该在自动释放池中

时间:2011-01-22 20:40:16

标签: objective-c

我对objective-c还很新。

据我所知,我不能从alloc,new,copy或mutableCopy获得的任何对象都应该被认为是在自动释放池中。

我认为这也意味着如果我创建一个创建并返回对象的新实例的函数,我应该在返回之前将它放在自动释放池中。

例如,我有一个解析xml的函数,并返回一个表示xml中数据的对象,该对象应该在返回之前位于自动释放池中。

我主要关心的是iPhone的开发,但我们将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以双向执行:返回调用者拥有的对象,或者返回不属于调用者的对象(例如,自动释放的对象)。无论选择哪种策略,请遵循命名约定。例如,

- (NSString *)fullNameCopy {
    return [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];
}

返回调用者拥有的NSString对象。方法名称为fullNameCopy,遵循命名规则:名称中包含“copy”的方法返回调用者拥有的对象。返回值不会放在自动释放池中。

可替换地,

- (NSString *)fullName {
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.LastName];
}

- (NSString *)fullName {
    NSString *s = [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];
    return [s autorelease];
}

返回一个不属于调用者的字符串,方法名称不包含alloc,new或copy。返回值是自动释放的,因此当相应的自动释放池耗尽时,它将被释放,除非调用者明确选择保留它。

也就是说,在您的特定场景中,第二个策略 - 返回一个不属于调用者的对象 - 看起来是一个更好的解决方案。调用者很可能会立即处理对象(因此他不会对拥有对象感兴趣)或将其保存在属性中(很可能是复制或保留属性)。

答案 1 :(得分:2)

是的,你的权利。如果您在函数中分配了内存,那么您也有责任释放它。因为您要返回已分配的对象,所以在这种情况下释放它的唯一方法是将其放在自动释放池中,例如

return [newObject autorelease];

(编辑)

答案 2 :(得分:0)

  1. 您应该阅读Objective-C memory management guide
  2. newalloccopy方法返回的任何对象都属于您。你拥有它,你必须释放它。
  3. 从任何其他方法返回的任何对象都在自动释放池中。如果要保持对象超出当前范围,则必须保留它。
  4. XML示例可能是正确的:如果您从方法返回一个对象,并且该方法的名称在名称中不包含newcopy,则按惯例,返回一个自动释放的对象。