我正在将一个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
After func2 myDouble = 1.2
发布于 2011-01-15 11:49:47
我假设你的函数现在可能看起来像这样:
void doSomethingWithDouble(double number) {
number = number *2;
}如果你想让函数直接修改双精度,那么你可以把它改成:
void doSomethingWithDouble(double *number) {
*number = *number / 2.0;
}这会修改传递的值,但您必须传递一个指针。这方面的一个例子是:
double test = 2.0;
doSomethingWithDouble(&test);不过,根据记录,这都是纯C语言,而不是Objective-C语言。
发布于 2011-01-15 16:24:00
@Stefan并不完全正确;双精度型之所以按值传递,不是因为它不是指针类型,而是因为在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++)确实支持按引用传递,但这是另一个主题...
发布于 2011-01-15 11:39:00
Double不是指针类型,因此通过值传递。您需要使用像NSNumber这样的指针类型,才能使调用函数中的更改生效。
编辑:
但正如@Tom Dalling指出的那样,NSNumber是不可变的。所以你可能不得不让你的函数返回你需要的值。
https://stackoverflow.com/questions/4697810
复制相似问题