此方法由Xcode 3.2使用“Accessor defs to clipboard”生成
- (void)setBodyMass:(int)newBodyMass {
if (bodyMass != newBodyMass) {
bodyMass = newBodyMass;
}
}
我可以像你在下面看到的那样容易地写这个吗?它似乎正在进行条件测试,以保存它可能的冗余分配。
- (void)setBodyMass:(int)newBodyMass {
bodyMass = newBodyMass;
}
欢呼 - 加里 -
答案 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
中。由于我们使用指针,obj
和setObject:
指向内存中的同一个对象,现在保留计数为1.
在线 3 ,您将相同的对象再次传递给anObj
。但是,在该方法中,您立即释放o
,,这是obj
和o
指向的同一对象!这意味着{{1} },obj
和anObj
的保留计数为 0 。当您将obj
设置为[obj retain]
时,您将obj
指向已经发布的对象。
这显然很糟糕,所以当使用处理对象的mutator方法时,你应该总是使用那个guard,它会有效地检查obj
和anObj
是否指向内存中的同一个对象;如果他们这样做,没有任何反应。
然而,在你的例子中没有必要使用这个保护,因为你传递的是int
- 而不是指针 - 和int
,当然永远不会被释放(因为它们不是对象)。
答案 1 :(得分:2)
我会按你的方式去做;分配int
非常便宜。如果赋值是针对某些大型数据结构或者可能具有意外的副作用,则检查是有意义的,int
都不是这样。
答案 2 :(得分:1)
分配是否导致触发事件(事件)?似乎不是这样。你可以比较但是对于一个简单的int,我认为没有义务验证值是否相同。当然,如果您想向用户显示有关输入相同值的内容,您可以检查该值,否则,我不会检查它。