我正在将一个iVar传递给一个函数。 iVar是双倍的。函数内部的iVar值是正确的,但函数外部的iVar值不会改变。这必须与我将iVar接收到函数中的方式有关。如何传递双iVar,以便在对象中更改其值,而不仅仅是在函数中? 我用指针做同样的事情,结果是预期的,所以我认为我不理解在c / objective-c中传递的标量参数。
代码如下所示: .H
@interface myClass: NSObject
{
double myDouble;
}
- (void)func1;
- (void)func2: (double)myDouble;
的.m
- (void)func1 {
myDouble = 1.2
NSLog(@"Before func2 myDouble = %f", myDouble);
[self func2: myDouble];
NSLog(@"After func2 myDouble = %f", myDouble);
}
- (void)func2: (double)adouble
{
NSLog(@"In func2 before operation adouble = %f",adouble);
NSLog(@"In func2 before operation myDouble = %f", myDouble);
adouble = 3.4;
NSLog(@"In func2 after operation adouble = %f",adouble);
NSLog(@"In func2 after operation myDouble = %f", myDouble);
}
结果:
在func2 myDouble = 1.2之前
在操作前的func2中,adouble = 1.2
在操作前的func2中myDouble = 1.2
运行后的func2 adouble = 3.4
操作后的func2中myDouble = 1.2
在func2 myDouble = 1.2之后
答案 0 :(得分:4)
我假设你的功能现在可能看起来像这样:
void doSomethingWithDouble(double number) {
number = number *2;
}
如果你想让函数直接修改double,那么你可以将它改为:
void doSomethingWithDouble(double *number) {
*number = *number / 2.0;
}
这会修改传递的值,但您必须传递指针。这方面的一个例子是:
double test = 2.0;
doSomethingWithDouble(&test);
但是对于记录来说,这只是简单的C,而不是Objective-C。
答案 1 :(得分:1)
@Stefan不太正确; double传递值不是因为它不是指针类型,而是因为所有在C和Objective-C中按值传递。您可以将参数传递视为初始化局部变量。使用原始的myClass和func2以及声明:
myClass anInst = [myClass new];
double someNum = 4.2;
然后是电话:
[anInst func2:someNum];
评估为:
[myClass func2:someNum];
=> enter a new method(function) scope, creating the local vars of func2
adouble = someNum; // that is func2's adouble and the callers someNum
// only the value in someNum is copied into adouble
adouble = 3.4; // the body of func2 - this has no effect on someNum
<= return from func2's scope
// someNum has not changed
如果参数具有指针类型,同样的事情会发生,唯一的区别是虽然你通过值传递指针,你可以修改指针值所指的对象/变量/内存的内容 - 但你还是要穿不要改变指针。
C ++(和Objective-C ++)确实支持pass-by-reference,但这是另一个话题......
答案 2 :(得分:0)
Double不是指针类型,因此通过值传递。您需要使用类似NSNumber的指针类型,以便在调用函数中影响更改。
编辑:
但正如@Tom Dalling指出的那样,NSNumber是不变的。所以你可能必须让你的函数返回你需要的值。