2016-05-13 104 views
3

我有一個簡單的問題。如下圖所示,如果我聲明的NSString(ref類型):Objective-C NSString參考類型

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

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

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

產生的輸出是這樣的:

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

從我的理解,當我分配@「100」到johnsMoney應該難道不也是變化「marysMoney」的值爲100,因爲marysMoney指向johnsMoney。

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

他們不是引用。他們是對象指針。如果兩個變量碰巧指向同一個對象,將一個指針改爲指向另一個對象對另一個指針沒有影響。

兩個人站在靠近對方的思考。兩者都伸出手臂並指向同一張桌子。現在有一個人轉身指着椅子。另一個人不受影響。他們仍然指着桌子。

+0

對象指針*是*引用。他們恰好相互獨立。 – Avi

4

johnsMoneymarysMoney都是pointers to strings

當你寫johnsMoney = @"100",它指向一個不同的字符串。這並不會改變marysMoney,它仍然指向原始字符串。

如果您使用的是NSMutableString,並且您的確輸入了[johnsMoney setString:@"100"],那麼它會更改底層數據(兩個變量仍將指向這些數據)。

0

號記住你正在處理的指針。所以,當你做

johnsMoney = @"100"; 

您設置johnsMoney指針,其中包含了@"100"值不同的內存地址。 marysMoney仍指向具有@"200"值的原始地址。

0

在您的示例中的局部變量marysMoney保持的強引用初始johnsMoney對象。當johnsMoney屬性發生變化時,物業不再保持較強的參考原始值,但該值仍然是由marysMoney強變量保持活力。

0

@ 「200」 是用於一個NSString對象目標c表示法。它將擁有自己的內存空間,johnsmoney將指向它。所以,marysmoney從來沒有真正指向johnsmoney。

實際發生的是什麼...

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

johnsmoney點@ 「200」。 marysmoney也指向@「200」。當johnsmoney被分配@「100」時,johnsmoney指向@「100」。雖然marysmoney仍然指向@「200」。

0

假設字符串:
@ 「200」 指針地址:0xeeff
@ 「100」 指針地址:0xeeaa

所以,你的代碼可能像這樣的改變:

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

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

marysMoney指針地址沒有改變,但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.