[英]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
已经指向的对象没有影响。 您仅需获得两个指针,每个指针都指向不同的对象。
为了实现使aString
和bString
指向您需要更改的同一对象的所需行为,您将需要一个可变的对象(如Franklin所说的NSMutableString
)。
这将允许您突变基础对象,而不是创建并指向新对象–因此, aString
和bString
在突变后将保持指向同一对象,从而使它们都能观察到相同的值。
突变看起来就像这样:
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.