这里有两种方法那个更好?没看懂...
谢谢!
- (void)setName:(NSString *)name
{
//one way
[_name release];
[name retain];
_name = name;
//another way
//[_name autorelease];
//_name = [name retain];
}
最佳答案
结果是一样的,但从性能和多线程的角度来看,第一个更好。
自动释放池会占用一些额外的资源,将对象放到某个堆栈上,在下一个线程周期调用释放。如果您在其他主线程中使用它,您还需要创建自动释放池,否则对象将泄漏。
autorelease 在某些 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
。如果可能,请尝试即时释放对象。
关于ios - OC Setter方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604008/