Objective c 这是必要的吗?

Objective c 这是必要的吗?,objective-c,Objective C,此方法由Xcode 3.2使用“访问器defs到剪贴板”生成 我可以像你在下面看到的那样简单地写下这个吗?它似乎在做一个条件测试来保存它,并做一个可能的冗余赋值 - (void)setBodyMass:(int)newBodyMass { bodyMass = newBodyMass; } 干杯-加里-我会按照你的方式做;分配int非常便宜。如果分配给某个大型数据结构或可能有意外的副作用,那么检查是有意义的,对于int我会按照您的方式进行;分配int非常便宜。如果赋值是针对某个

此方法由Xcode 3.2使用“访问器defs到剪贴板”生成

我可以像你在下面看到的那样简单地写下这个吗?它似乎在做一个条件测试来保存它,并做一个可能的冗余赋值

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

干杯-加里-

我会按照你的方式做;分配
int
非常便宜。如果分配给某个大型数据结构或可能有意外的副作用,那么检查是有意义的,对于
int

我会按照您的方式进行;分配
int
非常便宜。如果赋值是针对某个大型数据结构的,或者可能有意外的副作用,那么该检查是有意义的,对于
int

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

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

通常,您会在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
指向内存中的同一个对象,该对象现在的保留计数为1

在第3行,再次将同一对象传递给
setObject:
。但在该方法中,您立即释放了
anObj
,这是
o
obj
指向的同一个对象!这意味着
o
obj
anObj
的保留计数为0。当您将
obj
设置为
[obj retain]
时,您使
obj
指向已释放的对象

这显然是不好的,因此在使用处理对象的mutator方法时,应该始终使用该保护,它可以有效地检查
obj
anObj
是否指向内存中的同一对象;如果他们这样做,什么也不会发生


但是,在您的示例中,这个保护是不必要的,因为您传递的是
int
——而不是指针,
int
s当然永远不会被释放(因为它们不是对象)。

通常您在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
指向内存中的同一个对象,该对象现在的保留计数为1

在第3行,再次将同一对象传递给
setObject:
。但在该方法中,您立即释放了
anObj
,这是
o
obj
指向的同一个对象!这意味着
o
obj
anObj
的保留计数为0。当您将
obj
设置为
[obj retain]
时,您使
obj
指向已释放的对象

这显然是不好的,因此在使用处理对象的mutator方法时,应该始终使用该保护,它可以有效地检查
obj
anObj
是否指向内存中的同一对象;如果他们这样做,什么也不会发生


但是,在您的示例中,这个保护是不必要的,因为您传递的是
int
——而不是指针,
int
s当然永远不会被释放(因为它们不是对象)。

如果它已经设置为相同的值,我不明白为什么要重置它。IIRC,这只是一个样式指南。它可以防止您在分配任务之前意外忘记调用[bodyMass release]。我可以理解为什么要对对象(如NSString)进行测试,因为如果您不在那里进行测试,您将面临释放对象的风险。但在这种情况下,与设置重复值的频率相比,它似乎归结为“如果”的开销。[bodyMass release]现在我很困惑,它是int?我当然不是专家,但我没想到会发布int;INT不需要(实际上,不能)释放。如果它已经设置为相同的值,我不明白为什么要重置它。IIRC,这只是一个样式指南。它可以防止您在分配任务之前意外忘记调用[bodyMass release]。我可以理解为什么要对对象(如NSString)进行测试,因为如果您不在那里进行测试,您将面临释放对象的风险。但在这种情况下,与设置重复值的频率相比,它似乎归结为“如果”的开销。[bodyMass release]现在我很困惑,它是int?我当然不是专家,但我没想到会发布int;ints不需要(事实上,不能)发布。谢谢Michael(我猜这是对的),和往常一样,这是一个非常清晰的例外答案