关于伊娃的争论

时间:2011-01-15 03:34:26

标签: objective-c

我正在将一个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之后

3 个答案:

答案 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是不变的。所以你可能必须让你的函数返回你需要的值。