可可字符串问题

时间:2009-08-21 19:34:06

标签: cocoa memory-management nsstring

我有一个NSString,我想将其值写入NSMutableString。这是有效的吗?

NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = temp;

我问,因为虽然这似乎可行,但我认为这会将temp和mutable分配给相同的地址空间。将值传递给方法或从方法返回值时,我有很多这个问题。有时我看到其他人这样做或者使用stringWithString或initWithString创建可变字符串。感谢

2 个答案:

答案 0 :(得分:10)

您可以使用mutableCopy方法创建接收器的可变副本,并应用于采用NSMutableCopying协议的任何类(其中NSString是其中之一):

NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = [temp mutableCopy];

这将创建字符串的可变副本,作为新的字符串实例。在这种情况下,它不适用,因为temp是一个自动释放的字符串,但如果您不再需要它,则需要释放您复制的旧字符串。

由于mutableCopy包含“copy”,因此您需要对新字符串进行内存管理(根据Apple Object Ownership Policy获取所有权)。

您使用的方法只是将mutable指定为以前实例化NSString的指针。

答案 1 :(得分:5)

似乎让很多人与Cocoa混淆的一件事是变量和对象之间的区别。

您必须记住,当您声明类似NSMutableString *mutable之类的变量时,您不会创建字符串。这只是NSMutableString*类型的指针变量。在结构上,它与任何其他指针一样 - 而且,正如术语“指针”所暗示的那样,它只指向实际存在于其他地方的东西。因此,您在技术上可以将其指定为指向任何对象。但是你不是把那个对象变成一个可变的字符串 - 你只是在说谎变量所指向的对象。一旦你尝试向对象发送只有NSMutableString可以响应的消息,jig就会启动!

正如Perspx所说,如果你有一个你想改变的字符串,你可以使用mutableCopy方法 - 你猜对了 - 一个可变副本。还有很多NSString方法不会改变字符串,但是让你获得一个包含某些更改的新字符串(例如,stringByAppendingString:)。你可以走很长的路。