Objective c Objective-NSC字符串引用类型
我有一个简单的问题。如果我声明NSString(ref类型),如下所示:Objective c Objective-NSC字符串引用类型,objective-c,Objective C,我有一个简单的问题。如果我声明NSString(ref类型),如下所示: NSString *johnsMoney = @"200"; NSString *marysMoney = johnsMoney; NSLog(@"Johns Money %@",johnsMoney); NSLog(@"Marys Money %@",marysMoney); johnsMoney = @"100"; NSLog(@"Johns Money %@",johns
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"赋值给约翰斯莫尼时,它不应该也将"marysMoney"的值改为100,因为marysMoney指向约翰斯莫尼
更新:
我相信下面的例子说明了我最初试图做的事情:
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);
它们不是参考资料。它们是对象指针。如果两个变量恰好指向同一个对象,则将一个指针更改为指向另一个对象对另一个指针没有影响
想象两个人站在一起。两人都伸出一只手臂,指向同一张桌子。现在有一个人转身指着一把椅子。另一个人没有受到影响。他们仍然指着桌子。
johnsMoney
和marysMoney
都是
当您编写johnsMoney=@“100”
时,它现在指向一个不同的字符串。这不会改变仍然指向原始字符串的marysMoney
如果您使用的是
NSMutableString
,并且您使用了[johnsMoney setString:@“100”]
,那么它将更改基础数据(这两个变量仍然指向这些数据)。否。请记住,您使用的是指针。所以当你这么做的时候
johnsMoney = @"100";
您正在将
johnsMoney
指针设置为另一个包含@“100”
值的内存地址marysMoney
仍然使用@“200”
值指向原始地址。在您的示例中,局部变量marysMoney
保持对初始johnsMoney
对象的强引用。当更改johnsMoney
属性时,该属性不再保留对原始值的强引用,但该值仍由marysMoney
强变量保持活动。@“200”是NSString对象的objective-c表示法。它将有自己的内存空间,约翰斯莫尼将指向它。所以,marysmoney从来没有真正指向johnsmoney
实际上发生的是
Johns Money 200 // pointer 1
Marys Money 200 // pointer 1
Johns Money 100 // pointer 2
Marys Money 200 // pointer 1
约翰斯莫尼指的是"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);
所以我想你明白了。我不想通过包含指针来以复杂的方式思考它
注意:如果有人觉得这是垃圾,请避免回答我的问题。很抱歉把它寄了。我只是吐出了指针的概念。我不知道我的答案有多正确。
NSString
是值类型。(不可变)
还有一个概念是sting-iterning
NSString *johnsMoney = @"200";
NSString *marysMoney = johnsMoney;
johnsMoney = @"100";
因此,当您更改johnsMoney字符串时,它现在指向新的内存地址。但marysMoney仍然有旧的刺(即200),所以指向以前的地址
转到本教程,您将学到真正的新东西。
对象指针是引用。他们只是碰巧彼此独立。我想,这个答案将消除疑问。