以下两种方式更好?我不明白......
谢谢!
- (void)setName:(NSString *)name
{
//one way
[_name release];
[name retain];
_name = name;
//another way
//[_name autorelease];
//_name = [name retain];
}
答案 0 :(得分:1)
- (void)setName:(NSString *)name
{
// this is best practice which recommended by Apple
// this would be better
[_name release]; // _name variable is released
[name retain]; // name variable increase retain count
_name = name; // _name variable is pointed to name
// just another way
// [_name autorelease]; // _name variable will be released but don't know when this happens (maybe circle of memory management)
// _name = [name retain];
}
答案 1 :(得分:1)
结果是一样的,但是从性能和多线程的角度来看,第一个结果更好。
自动释放池将占用一些额外的资源,将对象放到某个堆栈上,该堆栈在下一个线程周期中调用release。如果你在其他主线程中使用它,你还需要创建自动释放池或对象将泄漏。
自动释放在某些getter方法中非常有用,在这些方法中,您创建返回的对象以确保它会在一段时间后释放,而不是动态,因为您可能需要延长其生命周期:
- (NSObject *)generateObject {
//good
return [[[NSObject alloc] init] autorelease];
//will be deallocated on the fly
NSObject *toReturn = [NSObject alloc] init];
[toReturn release];
return toReturn;
}
第二种方法将在调用release时释放对象,这意味着该方法无用。第一种方法可行,使用object = [[self generateObject] retain]
您将重新获得对象的所有权,并且在调用另一个release
或autorelease
之前不会取消分配。请注意,如果对象的生命周期比线程周期短,则不需要重新获得所有权,这意味着如果您不将其作为对象中的某个参数传递,稍后将使用它或在其他线程上使用它。
你应该知道使用循环等场景的这种差异:如果你使用[UIImage imageWithContentsOfFile:]
进行迭代让100个图像你的应用程序很可能会因为大量的内存消耗而被杀死,因为所有100个图像都将在内存中循环结束,因为它们正在自动释放。另一方面,使用[[[UIImage alloc] initWithContentsOfFile:] release]
将动态解除分配图像数据,并将按预期工作。
所以一般来说,我建议你只有在没有其他办法时才使用autorelease
。如果可能,请尝试即时释放对象。