我在过去几天一直在研究一些基础知识,我意识到我从未真正理解为什么NSString / NSMutableString的传递引用不起作用。
- (void)testing{
NSMutableString *abc = [NSMutableString stringWithString:@"ABC"];
[self testing:abc];
NSLog(@"%@",abc); // STILL ABC
}
-(void)testing:(NSMutableString *)str {
str = [NSMutableString stringWithString:@"HELP"];
}
我该如何解决这个问题?我希望我的测试方法能够从main方法操作String。我一直在使用Mutable Arrays,字典等,并且工作正常。感觉奇怪,我从来没有意识到它如何与字符串一起使用。
但是这个值会发生变化,这是对第一个字符串的引用
NSMutableString *string1;
NSMutableString *string2;
string1 = [NSMutableString stringWithString: @"ABC"];
string2 = string1;
[string2 appendString: @" HELP"];
NSLog (@"string1 = %@", string1); // ABC HELP
NSLog (@"string2 = %@", string2); // ABC HELP
答案 0 :(得分:5)
与Java一样,Objective-C只传递和按值分配。也像Java一样,对象总是在指针后面(你永远不会把对象本身放到变量中)。
指定或传递对象指针时,指针会被复制并指向与原始指针相同的对象。这意味着,如果对象是可变的(即它有一些方法可以改变其内容),那么你可以通过一个指针改变它,并通过另一个指针看到效果。始终通过调用方法或直接分配字段来实现变异。
-(void)testing:(NSMutableString *)str {
[str setString:@"HELP"];
}
分配指针永远不会改变它指向的对象;相反,它使指针指向另一个对象。
答案 1 :(得分:-1)
I cannot in good conscious let this wrong answer linger on the internet.
Pass by reference in objective c is POSSIBLE; which is why it is better than Java.
Here's how:
- (void)testing
{
NSMutableString *abc = [NSMutableString stringWithString:@"ABC"];
[self testingHelper:&abc];
NSLog(@"%@", abc); // NOW HELP
}
- (void)testingHelper:(NSMutableString **)str {
*str = [NSMutableString stringWithString:@"HELP"];
}