Ios OC设置器方法
这里有两种更好的方法?我不明白 谢谢大家!Ios OC设置器方法,ios,setter,Ios,Setter,这里有两种更好的方法?我不明白 谢谢大家! - (void)setName:(NSString *)name { //one way [_name release]; [name retain]; _name = name; //another way //[_name autorelease]; //_name = [name retain]; } 结果是一样的,但从性能和多线程的角度来看,第一个更好 自动释放池将占用一些额外的资源,
- (void)setName:(NSString *)name
{
//one way
[_name release];
[name retain];
_name = name;
//another way
//[_name autorelease];
//_name = [name retain];
}
结果是一样的,但从性能和多线程的角度来看,第一个更好 自动释放池将占用一些额外的资源,将对象放在某个堆栈上,该堆栈在下一个线程周期中调用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://code>迭代100个图像,您的应用程序很可能会由于大量内存消耗而被终止,因为所有100个图像都将在循环结束时存储在内存中,因为它们正在被自动删除。另一方面,使用[[[UIImage alloc]initWithContentsOfFile:]release]
将动态取消分配图像数据,并按预期工作
因此,一般来说,我建议您仅在没有其他方法时才使用自动释放。如果可能,尝试在飞行中释放对象
- (NSObject *)generateObject {
//good
return [[[NSObject alloc] init] autorelease];
//will be deallocated on the fly
NSObject *toReturn = [NSObject alloc] init];
[toReturn release];
return toReturn;
}