Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Objective-NSC字符串引用类型_Objective C - Fatal编程技术网

Objective c Objective-NSC字符串引用类型

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(ref类型),如下所示:

 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),所以指向以前的地址

转到本教程,您将学到真正的新东西。

对象指针是引用。他们只是碰巧彼此独立。我想,这个答案将消除疑问。