Bri*_*ian 1 cocoa memory-management nsstring
我有一个NSString,我想将其值写入NSMutableString.这是有效的:
NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = temp;
Run Code Online (Sandbox Code Playgroud)
我问,因为虽然这似乎可行,但我认为这会将temp和mutable分配给相同的地址空间.将值传递给方法或从方法返回值时,我有很多这个问题.有时我看到其他人这样做或者使用stringWithString或initWithString创建可变字符串.谢谢
Ale*_*ski 10
您可以使用该mutableCopy方法创建接收器的可变副本,并应用于采用该NSMutableCopying协议的任何类(其中NSString之一):
NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = [temp mutableCopy];
Run Code Online (Sandbox Code Playgroud)
这将创建字符串的可变副本,作为新的字符串实例.在这种情况下,它不适用,因为它temp是一个自动释放的字符串,但如果您不再需要它,您将需要释放您复制的旧字符串.
由于mutableCopy包含"copy",因此您需要对新字符串进行内存管理(根据Apple 对象所有权策略获取所有权).
您使用的方法只是指定mutable为先前实例化的指针NSString.
似乎让很多人与Cocoa混淆的一件事是变量和对象之间的差异.
你必须记住,当你声明一个变量时NSMutableString *mutable,你不是在创建一个字符串.这只是一个类型的指针变量NSMutableString*.在结构上,它与任何其他指针一样 - 而且,正如术语"指针"所暗示的那样,它只指向实际存在于其他地方的东西.因此,您在技术上可以将其指定为指向任何对象.但是你不是把那个对象变成一个可变的字符串 - 你只是在说谎变量所指向的对象.一旦你尝试向对象发送只有NSMutableString可以响应的消息,那么夹具就会启动!
正如Perspx所说,如果你有一个你想改变的字符串,你可以使用这个mutableCopy方法 - 你猜对了 - 一个可变的副本.还有很多NSString方法不会改变字符串,但是让你获得一个包含某些更改的新字符串(例如stringByAppendingString:).你可以走很长的路.
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |