通过目标C中的值或引用传递参数

Raf*_*ael 23 objective-c pass-by-reference

我对目标c有点新意,我试图通过引用传递参数,但表现得像是一个值.你知道为什么这不起作用吗?

这是功能:

- (void) checkRedColorText:(UILabel *)labelToChange {
    NSComparisonResult startLaterThanEnd = [startDate compare:endDate];
    if (startLaterThanEnd == NSOrderedDescending){
        labelToChange.textColor = [UIColor redColor];
    }
    else{
        labelToChange.textColor = [UIColor blackColor];
    }

}
Run Code Online (Sandbox Code Playgroud)

这就是电话:

UILabel *startHourLabel; // This is properly initialized in other part of the code
[self checkRedColorText:startHourLabel];
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Pie*_*ult 72

Objective-C 支持按值传递参数.这里的问题可能已经修复(因为这个问题已经超过一年了)但我需要澄清一些关于参数和Objective-C的事情.

Objective-CC严格超集,这意味着C所做的一切,Obj-C也是如此.

由于具有快速看一下维基百科,你可以看到Function parameters are always passed by value

Objective-C也不例外.这里发生的是每当我们将一个对象传递给一个函数(在本例中是一个UILabel*)时,我们传递指针地址中包含的值.

无论你做什么,它总是你所经历的价值.如果你想传递引用的值,你必须传递一个**对象(就像在传递NSError时经常看到的那样).

这与标量相同,它们是按值传递的,因此您可以修改方法中收到的变量的值,并且不会更改传递给函数的原始变量的值.

这是一个简化理解的例子:

- (void)parentFunction {
    int i = 0;
    [self modifyValueOfPassedArgument:i];
    //i == 0 still!
}

- (void)modifyValueOfPassedArgument:(NSInteger)j {
    //j == 0! but j is a copied variable. It is _NOT_ i
    j = 23;
    //j now == 23, but this hasn't changed the value of i.
}
Run Code Online (Sandbox Code Playgroud)

如果您希望能够修改i,则必须通过执行以下操作传递引用的值:

- (void)parentFunction {
    int i = 0; //Stack allocated. Kept it that way for sake of simplicity
    [self modifyValueOfPassedReference:&i];
    //i == 23!
}

- (void)modifyValueOfPassedReference:(NSInteger *)j {
    //j == 0, and this points to i! We can modify i from here.
    *j = 23;
    //j now == 23, and i also == 23!
}
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,是的,您只能按值传递基元.然而,这完全是误导性的,因为当指向对象的指针通过值传递时,该指针指向同一对象.由于没有其他通过(或处理)对象的方式,*对象*总是通过引用传递.他们唯一的表现就好像他们不是,如果OP说labelToChange = nil; 或类似的东西,但这是每个人都知道不会工作,不讨论的东西. (31认同)
  • 这是如此误导......对象在objective-c中通过引用传递给它增加了更多的乐趣,问题被对象询问并回答了通过值传递的int的解释.如果那不够有趣,你有60多张选票"Objective-C只支持按值传递参数." (3认同)

new*_*cct 11

与Java一样,Objective-C只有pass-by-value.与Java一样,始终通过指针访问对象."对象"永远不是直接值,因此您永远不会分配或传递对象.您正在按值传递对象指针.但这似乎不是问题 - 您正在尝试修改指针所指向的对象,这是完全允许的,并且与传值和传递引用无关.我没有看到您的代码有任何问题.