Objective-C NSString参考类型

问题描述:

我有一个简单的问题。如下图所示,如果我声明的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://*.com/a/16460928这个答案将清除疑问,我猜。 –

他们不是引用。他们是对象指针。如果两个变量碰巧指向同一个对象,将一个指针改为指向另一个对象对另一个指针没有影响。

两个人站在靠近对方的思考。两者都伸出手臂并指向同一张桌子。现在有一个人转身指着椅子。另一个人不受影响。他们仍然指着桌子。

+0

对象指针*是*引用。他们恰好相互独立。 – Avi

johnsMoneymarysMoney都是pointers to strings

当你写johnsMoney = @"100",它指向一个不同的字符串。这并不会改变marysMoney,它仍然指向原始字符串。

如果您使用的是NSMutableString,并且您的确输入了[johnsMoney setString:@"100"],那么它会更改底层数据(两个变量仍将指向这些数据)。

号记住你正在处理的指针。所以,当你做

johnsMoney = @"100"; 

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

在您的示例中的局部变量marysMoney保持的强引用初始johnsMoney对象。当johnsMoney属性发生变化时,物业不再保持较强的参考原始值,但该值仍然是由marysMoney强变量保持活力。

@ “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”。

假设字符串:
@ “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) 

因为它们都指向同一个地址,他们都改变了。

在简单。

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.