当前位置:  开发笔记 > IOS > 正文

这是否需要?

如何解决《这是否需要?》经验,为你挑选了1个好方法。

这个方法是由Xcode 3.2使用"Accessor defs to clipboard"生成的

- (void)setBodyMass:(int)newBodyMass {
    if (bodyMass != newBodyMass) {
        bodyMass = newBodyMass;
    }
}

我可以像你在下面看到的那样容易地写这个吗?它似乎正在进行条件测试以保存它可能的冗余分配.

- (void)setBodyMass:(int)newBodyMass {
        bodyMass = newBodyMass;
}

干杯 - 加里 -



1> mipadi..:

通常你会在mutator方法中做这样的检查,因为你正在使用必须是released的对象.假设你有一个没有检查的mutator方法:

- (void)setObject:(MyObject *)anObj
{
    [obj release];
    obj = [anObj retain];
}

想象一下(出于某种原因)你有一大堆这样的代码使用了这个方法:

MyObject *o = [MyObject object];    // Auto-released
[anotherObject setObject:o];
[anotherObject setObject:o];

在第1行,您可以假设o保留计数为0(因为它是自动释放的).在第2行,o已传递给setObject:,保留它并将其存储在实例变量中obj.因为我们正在使用指针,oobj指向内存中的同一个对象,现在它的保留计数为1.

在第3行,您再次传递相同的对象.但是,在那个方法中,你发布,这是同一个对象,指向指向!这意味着,和有一个保留数0.设置为时,您将指向已经释放的对象.setObject: anObjoobjoobjanObjobj[obj retain]obj

这显然是不好的,所以当使用处理对象的mutator方法时,你应该总是使用那个后卫,它有效地检查是否objanObj指向内存中的同一个对象; 如果他们这样做,没有任何反应

但是,在你的例子中,这个守卫不是必需的,因为你传递的是int- 而不是指针 - int当然,s永远不会被释放(因为它们不是对象).

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有