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

Pointers to the same object Objective-c

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

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

aString = @"Goodbye";

我希望 bString 指向与 aString 相同的对象。因此,如果 aString 的值发生变化,则 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

这是代码中发生的事情的可视化,逐行显示。

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

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

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

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

为了实现让 aStringbString 指向同一个对象的预期行为,您需要能够更改它,您将需要一个 可变对象(如NSMutableString,正如富兰克林所说)。

这将允许您改变底层对象,而不是创建并指向一个新对象——因此 aStringbString 将在改变后保持指向同一个对象,允许它们两者都观察到相同的值。

突变看起来像这样:

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

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

1) 无论何时使用 @"" 语法创建字符串,框架都会自动缓存该字符串。 NSString 是一个非常特殊的 class,但框架会处理它。当你在应用的多个地方使用 @"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 指向不同的内存区域。