我有一个NSString,我想将其值写入NSMutableString。这是有效的吗?
NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = temp;
我问,因为虽然这似乎可行,但我认为这会将temp和mutable分配给相同的地址空间。将值传递给方法或从方法返回值时,我有很多这个问题。有时我看到其他人这样做或者使用stringWithString或initWithString创建可变字符串。感谢
答案 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:
)。你可以走很长的路。