通过参考传递值和传递

时间:2012-05-09 08:42:40

标签: objective-c nsstring pass-by-reference

我在过去几天一直在研究一些基础知识,我意识到我从未真正理解为什么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

2 个答案:

答案 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"];
}