这是否需要?

时间:2009-09-16 20:48:33

标签: objective-c

此方法由Xcode 3.2使用“Accessor defs to clipboard”生成

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

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

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

欢呼 - 加里 -

3 个答案:

答案 0 :(得分:6)

通常你会在mutator方法中进行检查,因为你正在使用必须为release d的对象。假设你有一个没有检查的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会将其保留并存储在实例变量o中。由于我们使用指针,objsetObject:指向内存中的同一个对象,现在保留计数为1.

在线 3 ,您将相同的对象再次传递给anObj 。但是,在该方法中,您立即释放o,这是objo指向的同一对象!这意味着{{1} },objanObj的保留计数为 0 。当您将obj设置为[obj retain]时,您将obj指向已经发布的对象。

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

然而,在你的例子中没有必要使用这个保护,因为你传递的是int - 而不是指针 - 和int,当然永远不会被释放(因为它们不是对象)。

答案 1 :(得分:2)

我会按你的方式去做;分配int非常便宜。如果赋值是针对某些大型数据结构或者可能具有意外的副作用,则检查是有意义的,int都不是这样。

答案 2 :(得分:1)

分配是否导致触发事件(事件)?似乎不是这样。你可以比较但是对于一个简单的int,我认为没有义务验证值是否相同。当然,如果您想向用户显示有关输入相同值的内容,您可以检查该值,否则,我不会检查它。