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