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);
他们不是引用。他们是对象指针。如果两个变量碰巧指向同一个对象,将一个指针改为指向另一个对象对另一个指针没有影响。
两个人站在靠近对方的思考。两者都伸出手臂并指向同一张桌子。现在有一个人转身指着椅子。另一个人不受影响。他们仍然指着桌子。
对象指针*是*引用。他们恰好相互独立。 – Avi
johnsMoney
和marysMoney
都是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.
https://stackoverflow.com/a/16460928这个答案将清除疑问,我猜。 –