0

在过去的几天里,我一直在研究一些基础知识,我意识到我从来没有真正理解为什么 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 方法操作字符串。我一直在将它与可变数组、字典等一起使用,并且工作正常。感觉很奇怪,我从来没有意识到它是如何与字符串一起工作的。

但是值会以这样的方式发生变化,这是对第一个字符串的引用

NSMutableString *string1;
NSMutableString *string2;

string1 = [NSMutableString stringWithString: @"ABC"];
string2 = string1;

[string2 appendString: @" HELP"];

NSLog (@"string1 = %@", string1); // ABC HELP
NSLog (@"string2 = %@", string2); // ABC HELP
4

2 回答 2

5

和 Java 一样,Objective-C 也只有按值传递和赋值。也像 Java 一样,对象总是在指针后面(你永远不会将对象本身放入变量中)。

当您分配或传递对象指针时,该指针被复制并指向与原始指针相同的对象。这意味着,如果对象是可变的(即它有一些改变其内容的方法),那么您可以通过一个指针改变它并通过另一个指针查看效果。突变总是通过调用方法或直接分配给字段来实现。

-(void)testing:(NSMutableString *)str {
  [str setString:@"HELP"];
}

分配给指针永远不会改变它指向的对象;相反,它使指针指向另一个对象。

于 2012-05-09T18:07:23.720 回答
-1

我不能有意识地让这个错误的答案在互联网上徘徊。

在目标 c 中通过引用传递是可能的;这就是为什么它比 Java 更好。

就是这样:

- (void)testing
{    
    NSMutableString *abc = [NSMutableString stringWithString:@"ABC"];
    [self testingHelper:&abc];
    NSLog(@"%@", abc); // NOW HELP
}

- (void)testingHelper:(NSMutableString **)str {
    *str = [NSMutableString stringWithString:@"HELP"];
}
于 2015-07-28T16:19:05.140 回答