Objective-C NSString 参考类型

3
我是一个有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个简单的问题。如果我像下面展示的那样声明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。

更新:

我相信以下示例展示了我最初尝试做的事情:

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);

这个答案应该能够解决疑惑。 - bharathi kumar
8个回答

4

johnsMoneymarysMoney都是指向字符串的指针

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

如果你使用NSMutableString,并且执行了[johnsMoney setString:@"100"],那么它将更改底层数据(两个变量仍将指向该数据)。


1
他们不是引用。它们是对象指针。如果两个变量恰好指向同一个对象,将一个指针更改为指向另一个对象对另一个指针没有影响。
想象两个站在一起的人。他们都伸出胳膊指向同一张桌子。现在一个人转身指向一把椅子。另一个人不会受到影响。他们仍然指向桌子。

对象指针 引用。它们只是独立于彼此。 - Avi

0

NSString 是值类型(不可变的)。

同时还有一个叫做 string interning 的概念。

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

所以,当您更改johnsMoney的字符串时,它现在指向新的内存地址。但marysMoney仍然具有旧的字符串(即200),因此指向先前的地址。

转到本教程,您将学习真正新颖的内容。 https://nshipster.com/equality/


0

不要忘记你正在处理指针。当你执行

johnsMoney = @"100";

你正在将 johnsMoney 指针设置为另一个包含 @"100" 值的内存地址。而 marysMoney 仍然指向原始地址,其值为 @"200"


0
在你的例子中,本地变量marysMoney维护了对初始johnsMoney对象的强引用。当更改johnsMoney属性时,该属性不再保持对原始值的强引用,但该值仍由marysMoney强变量保持活动状态。

0

@"200"是Objective-C中NSString对象的表示法。它将拥有自己的内存空间,并且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);

所以我认为你已经明白了。我不想通过包含指针来复杂地思考它。

注意:如果有人觉得这是垃圾,请避免我的回答。很抱歉发帖。我只是吐出了指针的概念。我不知道我的答案有多正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接