看一下这样的二传手:
- (void)setCount:(NSNumber *)newCount {
[newCount retain];
[_count release];
// Make the new assignment.
_count = newCount;
}
如果我致电[self setCount:anNSNumber]
,效果将会发生(_count
将被释放,anNSNumber
将被保留,......如您所知)。但我知道在Obj-C中传递值是默认的。那么,为什么会发生这种情况?
答案 0 :(得分:2)
参数按值传递。在这种情况下,参数是指针。指针而不是对象按值传递。
答案 1 :(得分:2)
你说Objective-C使用pass-by-value是正确的;它不仅仅是默认值,而是唯一支持的参数传递机制。 Objective-C ++也支持C ++传递引用。
在您的表达式[self setCount:anNSNumber]
中,变量anNSNumber
中的值将传递给setCount
。但是,该值是NSNumber *
类型的引用,该引用可用于修改引用的对象。
为参数传递的值用于初始化被调用者中的局部变量,您可以修改该变量中的值而不会对调用者产生任何影响 - 这是按值调用的定义。例如,您可以添加到setCount
:
newCount = [NSNumber numberWithInteger:42];
这对调用者没有任何影响。