繁体   English   中英

指向同一对象Objective-c的指针

[英]Pointers to the same object Objective-c

我有以下代码。 当我打印出aString时,它是再见;当我打印出bString时,它是Hellworld。 bString不应该指向与aString相同的对象。 我希望这两本都可以再见。 另外,当我打印出指针的内存地址时,它们是不同的内存地址。 有人可以解释为什么吗?

NSString *aString = @"Helloworld";
NSString *bString = aString;

aString = @"Goodbye";

我希望bString指向与aString相同的对象。 因此,如果aString的值更改,则bString的值也会更改,反之亦然。 我该如何实现?

这是代码中逐行显示的可视化内容。

aString –––––––––> @"Helloworld"

aString –––––––––> @"Helloworld"
                        ^
                        |
bString –––––––––––––––––

aString –––––––––> @"Goodbye"   @"Helloworld"
                                     ^
                                     |
bString ––––––––––––––––––––––––––––––

如您所见,将aString指向另一个对象对bString已经指向的对象没有影响。 您仅需获得两个指针,每个指针都指向不同的对象。

为了实现使aStringbString指向您需要更改的同一对象的所需行为,您将需要一个可变的对象(如Franklin所说的NSMutableString )。

这将允许您突变基础对象,而不是创建并指向新对象–因此, aStringbString在突变后将保持指向同一对象,从而使它们都能观察到相同的值。

突变看起来就像这样:

aString –––––––––> @"Helloworld"
                        ^
                        |
bString –––––––––––––––––

aString –––––––––>  @"Goodbye"
                        ^
                        |
bString –––––––––––––––––

NSString *aString = @"Helloworld";

在内存0x01 (或某处)中有一个字符串@"Helloworld" ; 然后将地址0x01分配给aString

NSString *bString = aString;

地址0x01被分配给bString 警告!

aString = @"Goodbye";

地址0x01 仍为 @"Helloworld" 此行不会更改字符串。 它创建一个新字符串@"Goodbye"并将其存储在0x46 (或0x01以外的其他位置),并将地址0x46分配给aString 要执行您想要的操作,请尝试NSMutableString

注意:不要创建新的NSMutableString 用修改当前的

- (void)setString:(NSString *)aString

1)每当使用@""语法创建字符串时,框架都会自动缓存该字符串。 NSString是一个非常特殊的类,但是框架会照顾它。 当您在应用的多个位置使用@"Some String"时,它们都将指向内存中的相同地址。 仅当您使用-initWithData:encoding ,才会缓存该字符串。

2)其他答案建议您应该改用-copy ,但是-copy仅在接收者可变的情况下才会创建不可变的副本。 (类似于NSMutableString )将-copy发送到不可变对象时,它将与-retain相同。

NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy = [originalString mutableCopy];
NSString *mutableCopyCopy = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];

originalString,copy,mutableCopyCopy和anotherString都将指向相同的内存地址,只有mutableCopy指向不同的内存区域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM