指向同一对象的指针 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
已经指向的对象没有影响。您只需得到两个指针,每个指针指向不同的对象。
为了实现让 aString
和 bString
指向同一个对象的预期行为,您需要能够更改它,您将需要一个 可变对象(如NSMutableString
,正如富兰克林所说)。
这将允许您改变底层对象,而不是创建并指向一个新对象——因此 aString
和 bString
将在改变后保持指向同一个对象,允许它们两者都观察到相同的值。
突变看起来像这样:
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 指向不同的内存区域。
我有以下代码。当我打印出 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
已经指向的对象没有影响。您只需得到两个指针,每个指针指向不同的对象。
为了实现让 aString
和 bString
指向同一个对象的预期行为,您需要能够更改它,您将需要一个 可变对象(如NSMutableString
,正如富兰克林所说)。
这将允许您改变底层对象,而不是创建并指向一个新对象——因此 aString
和 bString
将在改变后保持指向同一个对象,允许它们两者都观察到相同的值。
突变看起来像这样:
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 指向不同的内存区域。