我对objective-c还很新。
据我所知,我不能从alloc,new,copy或mutableCopy获得的任何对象都应该被认为是在自动释放池中。
我认为这也意味着如果我创建一个创建并返回对象的新实例的函数,我应该在返回之前将它放在自动释放池中。
例如,我有一个解析xml的函数,并返回一个表示xml中数据的对象,该对象应该在返回之前位于自动释放池中。
我主要关心的是iPhone的开发,但我们将不胜感激。
答案 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)
new
,alloc
或copy
方法返回的任何对象都属于您。你拥有它,你必须释放它。 XML示例可能是正确的:如果您从方法返回一个对象,并且该方法的名称在名称中不包含new
或copy
,则按惯例,返回一个自动释放的对象。