OC Setter方法

时间:2014-05-12 08:13:26

标签: ios setter

以下两种方式更好?我不明白......

谢谢!

- (void)setName:(NSString *)name
{
    //one way
    [_name release];
    [name retain];
    _name = name;

    //another way
    //[_name autorelease];
    //_name = [name retain];
}

2 个答案:

答案 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]您将重新获得对象的所有权,并且在调用另一个releaseautorelease之前不会取消分配。请注意,如果对象的生命周期比线程周期短,则不需要重新获得所有权,这意味着如果您不将其作为对象中的某个参数传递,稍后将使用它或在其他线程上使用它。

你应该知道使用循环等场景的这种差异:如果你使用[UIImage imageWithContentsOfFile:]进行迭代让100个图像你的应用程序很可能会因为大量的内存消耗而被杀死,因为所有100个图像都将在内存中循环结束,因为它们正在自动释放。另一方面,使用[[[UIImage alloc] initWithContentsOfFile:] release]将动态解除分配图像数据,并将按预期工作。

所以一般来说,我建议你只有在没有其他办法时才使用autorelease。如果可能,请尝试即时释放对象。