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

どうすればいいですか?テスト メソッドでメイン メソッドから String を操作できるようにしたいと考えています。私はこれを可変配列、辞書などで使用しており、正常に動作します。これが文字列でどのように機能するかを私がまったく理解していなかったのは奇妙に感じます。

しかし、値は最初の文字列への参照であるこのようなもので変更されます

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 と同様に、オブジェクトは常にポインターの背後にあります (オブジェクト自体を変数に入れることはありません)。

オブジェクト ポインターを代入または渡すと、ポインターがコピーされ、元のポインターと同じオブジェクトを指します。つまり、オブジェクトが変更可能である (つまり、その内容を変更するメソッドがある) 場合、1 つのポインターを介してオブジェクトを変更し、もう 1 つのポインターを介して効果を確認できます。ミューテーションは、常にメソッドを呼び出すか、フィールドに直接割り当てることによって実現されます。

-(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 に答える