2016-05-13 3 views
3

私は簡単な質問があります。下図のように私はNSStringの(参照型)を宣言していた場合:私はjohnsMoneyに「100」@割り当てるときに、それはまた、変更私の理解からObjective-C NSStringリファレンスタイプ

Johns Money 200 
Marys Money 200 
Johns Money 100 
Marys Money 200 

べきではありません。

NSString *johnsMoney = @"200"; 
    NSString *marysMoney = johnsMoney; 

    NSLog(@"Johns Money %@",johnsMoney); 
    NSLog(@"Marys Money %@",marysMoney); 

    johnsMoney = @"100"; 
    NSLog(@"Johns Money %@",johnsMoney); 
    NSLog(@"Marys Money %@",marysMoney); 

生成される出力はこれですmarysMoneyがjohnsMoneyを指しているので、 "marysMoney"の値を100に設定します。

UPDATE:

私は、次の例は、私が最初にやろうとしたものを示してい信じる:

Dog *dog1 = [[Dog alloc] init]; 
dog1.name = @"Dog 1"; 

Dog *dog2 = dog1; 

NSLog(@"Dog 1 %@",dog1.name); 
NSLog(@"Dog 2 %@",dog2.name); 

dog1.name = @"Dog 3"; 

NSLog(@"Dog 1 %@",dog1.name); 
NSLog(@"Dog 2 %@",dog2.name); 
+0

https://stackoverflow.com/a/16460928この答えは、私は推測する、疑問をクリアします。 –

答えて

1

彼らは参照できません。それらはオブジェクトポインタです。 2つの変数が同じオブジェクトを指している場合、あるポインタを別のオブジェクトを指すように変更しても、もう一方のポインタには何の効果もありません。

お互いに近くに立つ二人の人を考えてください。どちらも腕を持ち、同じテーブルを指します。今、一人が回り、椅子を指します。他の人は影響を受けません。彼らはまだテーブルを指しています。

+0

オブジェクトポインタ*は参照です。彼らはちょうどお互いに独立しています。 – Avi

4

johnsMoneyおよびmarysMoneyはともにpointers to stringsである。

johnsMoney = @"100"と書くと、別の文字列を指すようになりました。これは依然として元の文字列を指し示すmarysMoneyを変更しません。

NSMutableStringを使用していて、[johnsMoney setString:@"100"]を行った場合、両方の変数が依然として指している下位のデータが変更されます。

0

いいえあなたはポインタを扱っています。あなたは

johnsMoney = @"100"; 

を行うときにあなたは@"100"値が含まれている別のメモリアドレスにjohnsMoneyポインタを設定しています。 marysMoneyは、依然として@"200"の値を持つ元のアドレスを指しています。

0

例では、ローカル変数marysMoneyは、最初のjohnsMoneyオブジェクトへの強い参照を維持します。 johnsMoneyプロパティが変更されたとき、プロパティは元の値を強く参照しなくなりましたが、その値はmarysMoney強い変数によって引き続き有効です。

0

@ "200"は、NSStringオブジェクトのobjective-c表記法です。それはそれ自身の記憶空間を持ち、JohnsMoneyはそれを指すでしょう。だから、馬小屋は本当にジョンズモニーを指摘することはありません。実際に何が起こる

は、@ "200" に、この...

Johns Money 200 // pointer 1 
Marys Money 200 // pointer 1 
Johns Money 100 // pointer 2 
Marys Money 200 // pointer 1 

johnsmoneyポイントです。 marysmoneyは@ 200を指しています。 johnsmoneyが@ "100"に割り当てられると、johnsmoneyは@ "100"を指します。 marysmoneyはまだ "200"を指しています。

0

は、文字列を考える: "100" ポインタアドレス@
0xeeff:0xeeaaそう

、あなたのコードは、これらのように変更することがあります。

NSString *johnsMoney = @"200"; 
(johnsMoney = 0xeeff) 
NSString *marysMoney = johnsMoney; 
(marysMoney = 0xeeff) 

johnsMoney = @"100"; 
(johnsMoney = 0xeeaa) 
(marysMoney = 0xeeff) 

marysMoneyポインタ "200" ポインタアドレス@
アドレスは変更されませんが、johnsMoneyポインタアドレスは変更されました。同じよう


オブジェクトを仮定:
DOG1ポインタアドレス:

0xeeffはそう、あなたのコードは、これらのように変更することがあります。

Dog *dog1 = [[Dog alloc] init]; 
(dog1 pointer address: 0xeeff) 

dog1.name = @"Dog 1"; 

Dog *dog2 = dog1; 
(dog2 pointer address: 0xeeff) 

dog1.name = @"Dog 3"; 
(dog1 pointer address still: 0xeeff) 
(dog2 pointer address still: 0xeeff) 

として彼らと同じアドレスへのすべてのポイント、彼らは両方とも変わった。

0

で簡単に。

NSString *johnsMoney = @"200"; 
//here johnsMoney is declared as NSString, so it will be string type. 
//any thing given inside @"" will be considered as string. 
//currently, johnsMoney contains 200. 

NSString *marysMoney = johnsMoney; 
//here marysMoney is declared as NSString, so it will be string type. 
//johnsMoney is already a string. therefore, marysMoney automatically reads the 
//string in johnsMoney. so currently, marysMoney will also be 200. 

NSLog(@"Johns Money %@",johnsMoney); 
NSLog(@"Marys Money %@",marysMoney); 
//both will be printed as 200. right? 

johnsMoney = @"100"; 
//now johnsMoney reassigned as 100. 
//but still marysMoney is 200. 
//there is nothing written for changing maryMoney from 200. 

NSLog(@"Johns Money %@",johnsMoney); 
NSLog(@"Marys Money %@",marysMoney); 

だから、あなたはそれを持っていると思います。私はポインタを含めることによって複雑な方法でそれを考えたくはありません。

Note:if any one feels that it is rubbish, kindly please avoid my answer. am sorry to post it. i just only vomited the pointer concept. i don't know how much correct is my answer.

関連する問題