2012-05-09 36 views
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を操作できるようにしたい。私はMutable配列、辞書などでこれを使っていて、うまくいきます。私はこれが文字列でどのように動作するかは分かりませんでした。

しかし、値はJavaのような第一列

NSMutableString *string1; 
NSMutableString *string2; 

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

[string2 appendString: @" HELP"]; 

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

答えて

5

への参照であるこのようなものに変更されます、Objective-Cのは、通過した値によって割り当てました。また、Javaのように、オブジェクトは常にポインタの後ろにあります(決して変数にオブジェクト自体を置くことはありません)。

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

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

ポインターに割り当てると、ポイントするオブジェクトが変更されることはありません。むしろ、ポインタは別のオブジェクトを指し示します。

+0

:ここ

は方法です。あなたがあなたのプログラムに持っているポインタのコピーを作ることを意味するならば、それをより明確に述べるべきです。 –

+0

これで、setStringは、ポインタによって指された値を変更しました。これは、addMethodメソッドが行うNSMutable配列を使用する場合と同じです。 [NSMutableString stringWithString:@ "HELP"]すると新しい文字列に正しいポインタが返されるので、メイン(呼び出し)メソッドからのポインタが変更されないのはなぜですか? –

+1

@BK:メインメソッドのポインタは決して変更されません。値渡しです。ポインタは関数に渡されるときにコピーされます。ローカル変数に代入することは、決して外部に影響を与えることはできません。むしろ、オブジェクトのメソッドを使用して、ポインタが指すオブジェクトを変更する必要があります。 – newacct

-1

インターネットでこの間違った答えが残っていることをよく意識することはできません。

目的関数cでの参照渡しは可能です。それがJavaより優れている理由です。私はあなたが「あなたが同じオブジェクトへの2つのポインタを取得する」ことにより、意味を理解していない

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

- (void)testingHelper:(NSMutableString **)str { 
    *str = [NSMutableString stringWithString:@"HELP"]; 
} 
+0

値でポインタを渡しています。 – newacct

+0

@ライアンこれは、ここで説明しています - http://stackoverflow.com/a/22213239/257284 –

+0

したがって、値で参照を渡すと、参照によるシミュレートされたパス。私はこれが基準で合格したことを大学から教えられました。それは大学の学位の価値です。 –