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-C是C的严格超集,这意味着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)
new*_*cct 11
与Java一样,Objective-C只有pass-by-value.与Java一样,始终通过指针访问对象."对象"永远不是直接值,因此您永远不会分配或传递对象.您正在按值传递对象指针.但这似乎不是问题 - 您正在尝试修改指针所指向的对象,这是完全允许的,并且与传值和传递引用无关.我没有看到您的代码有任何问题.