ios - OC Setter方法

标签 ios setter

这里有两种方法那个更好?没看懂...

谢谢!

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

您应该了解使用循环等场景的差异:如果您使用 [UIImage imageWithContentsOfFile:] 迭代假设 100 张图像,您的应用程序很可能会由于大量内存消耗而被终止,因为所有100 张图像将在循环结束时存储在内存中,因为它们正在自动释放。另一方面,使用 [[[UIImage alloc] initWithContentsOfFile:] release] 将动态释放图像数据并按预期工作。

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

关于ios - OC Setter方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604008/

相关文章:

c# - 如何根据条件将 VIew 模型的属性绑定(bind)到 DataTrigger Setter?

javascript - 如何在 Javascript 对象(类)中使用 setter 和 getter?

ios - 通过单击 UITableView 单元格向后传递数据 - iOS/Swift

ios - Twilio 快速发送短信

ios - 游戏中心挑战

ios - 如何使导航栏与状态栏无缝衔接?

ios - 在我的应用程序上启用 iCloud 时,现有核心数据数据库未上传到 iCloud

javascript - javascript数组上的getter/setter?

Java Setter 和 Constructor 混淆

oop - Common Lisp 中类的 getter 和 setter