Objective C:将NSMutableString转换为NSString

70

我有一个NSMutableString,如何将它转换为NSString?


2
根据你最近(今天的)问题历史来看,似乎你应该找一本不错的Cocoa书籍,以了解ObjC世界中的基本工作原理。Aaron Hillegass的书是一个很好的起点。还可以参考http://cocoadevcentral.com/ 此外,发布半打略有不同版本的基本上相同的问题(String->CSV),其中我猜这个问题也与之相关,对你没有太大帮助。你只是在垃圾邮件SO并最终让人们忽视你的问题。 - Regexident
相反,你应该提供更多关于你初始问题的信息,如果提供的答案没有帮助到你,人们会尝试提供更合适的答案。一旦有一个答案解决了你的问题,请给它点赞并点击绿色的勾选标记来接受它。这样,其他遇到同样问题的用户就可以更容易地找到验证过的解决方案,并会在以后感谢你。此外,这也增加了你获得答案的机会 ;) - Regexident
1
是的,你说得对,抱歉...我会尽量少压迫一些。 - cyclingIsBetter
2个回答

107

可以通过以下方式之一:

NSString *immutableString = [NSString stringWithString:yourMutableString];

或通过:

NSString *immutableString = [[yourMutableString copy] autorelease];
//Note that calling [foo copy] on a mutable object of which there exists an immutable variant
//such as NSMutableString, NSMutableArray, NSMutableDictionary from the Foundation framework
//is expected to return an immutable copy. For a mutable copy call [foo mutableCopy] instead.

由于它是NSString的子类,因此您可以将其强制转换为NSString

NSString *immutableString = yourMutableString;

虽然实际上它是可变的,但会看起来像是不可变的。
很多方法声明返回不可变实例,但实际上返回的是可变实例。


1
好的答案!对于最后的解决方案,您不需要进行类型转换,因为NSMutableString继承自NSString,您始终可以将子类的类型分配给它继承的类型,而编译器不会抱怨。 - Senseful
@Regexident,你能告诉我吗?如果他们只是返回NSString(实际上是NSMutableString),那么当用户修改NSString对象时,他们不知道对象本身也会被改变,对吧?所以这个工作会产生一些副作用吗?谢谢 :) - hqt
一个以 NSString * 的形式出现的 NSMutableString * 不能被修改,除非将其强制转换回 NSMutableString *。如果一个方法的签名表示它返回不可变对象,但你将其强制转换为可变对象,则你依赖于实现细节,更糟糕的是,你有意破坏了可变性约定,因此对由此造成的任何损害负有责任。只要遵守规则,就是安全的(99%)。永远编写代码,就好像你从未看过除当前正在编辑的文件之外的任何 .m 文件一样。嗯,其实你可能应该知道,但你的代码不应该知道。 - Regexident

4

NSMutableStringNSString 的子类,所以你可以将其强制类型转换:

NSString *string = (NSString *)mutableString;

在这种情况下,string将是mutableString的别名,但如果您尝试调用任何可变方法,则编译器会报错。
此外,您可以使用类方法创建一个新的NSString:
NSString *string = [NSString stringWithString:mutableString];

你能告诉我,如果它们只是返回NSString(实际上是NSMutableString),那么当用户修改NSString对象时,他们不知道对象本身也会被改变,对吗?这样做会产生一些副作用吗?谢谢 :) - hqt
但是,如果通过mutableString变量更改了基础可变字符串,那么它是否实际上会更改不可变字符串的基础值?如果它们都是指向同一对象的指针,似乎必须这样做。 - Tom Bogle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接