首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ivars的参数传递

关于ivars的参数传递
EN

Stack Overflow用户
提问于 2011-01-15 11:34:26
回答 3查看 153关注 0票数 0

我正在将一个iVar传递给一个函数。iVar是一个替身。函数内部的iVar的值是正确的,但函数外部的iVar的值没有更改。这一定与我将iVar接收到函数中的方式有关。如何传入一个双精度iVar,使其值在对象中更改,而不仅仅是在函数中更改?我对指针做了同样的事情,结果和预期的一样,所以我认为我没有理解在c/objective-c中传递标量参数。

代码如下所示:.h

代码语言:javascript
复制
    @interface myClass: NSObject
    {
        double myDouble;
    }

        - (void)func1;
        - (void)func2: (double)myDouble;

.m

代码语言:javascript
复制
- (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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-15 11:49:47

我假设你的函数现在可能看起来像这样:

代码语言:javascript
复制
void doSomethingWithDouble(double number) {
    number = number *2;
}

如果你想让函数直接修改双精度,那么你可以把它改成:

代码语言:javascript
复制
void doSomethingWithDouble(double *number) {
    *number = *number / 2.0;
}

这会修改传递的值,但您必须传递一个指针。这方面的一个例子是:

代码语言:javascript
复制
double test = 2.0;
doSomethingWithDouble(&test);

不过,根据记录,这都是纯C语言,而不是Objective-C语言。

票数 4
EN

Stack Overflow用户

发布于 2011-01-15 16:24:00

@Stefan并不完全正确;双精度型之所以按值传递,不是因为它不是指针类型,而是因为在C和Objective-C中一切都是按值传递的。您可以将参数传递视为初始化局部变量。使用原始的myClass和func2以及声明:

代码语言:javascript
复制
myClass anInst = [myClass new];
double someNum = 4.2;

然后调用:

代码语言:javascript
复制
[anInst func2:someNum];

评估结果为:

代码语言:javascript
复制
[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++)确实支持按引用传递,但这是另一个主题...

票数 1
EN

Stack Overflow用户

发布于 2011-01-15 11:39:00

Double不是指针类型,因此通过值传递。您需要使用像NSNumber这样的指针类型,才能使调用函数中的更改生效。

编辑:

但正如@Tom Dalling指出的那样,NSNumber是不可变的。所以你可能不得不让你的函数返回你需要的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4697810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档