目标C:在NSString中转换NSMutableString


67

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


2
从您最近(今天)的问题历史来看,您似乎应该像一本关于可可的好书,以基本了解事物在ObjC世界中的工作方式。亚伦·希勒加斯(Aaron Hillegass)的书是一个很好的开始。另请访问cocoadevcentral.com进一步了解:发布一些基本相同的问题(字符串-> CSV)的略有不同的版本,我想这个问题也与之相关,对您没有太大帮助。您只是在滥发垃圾邮件,最终使人们忽略您的问题。
Regexident 2011年

相反,如果提供的答案没有帮助您,则您应该去为您的第一个问题提供更多信息,而人们会尝试提供更合适的答案。答案解决了您的问题后,请给它一个赞号,然后单击绿色的对勾接受它。这样,其他有相同问题的用户可以轻松得多地找到经过验证的解决方案,稍后将感谢您。同时,它也增加了您实际上首先获得答案的机会;)
Regexident 2011年

1
是的,你说得对,对不起....我会尽量少压迫
cyclingIsBetter

Answers:


102

通过:

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,并且您始终可以将子类的类型分配给其继承的类型,而无需编译器抱怨。
有意义的

@Regexident你能告诉我吗。如果他们只是返回NSString(实际上是NSMutableString当用户修改NSString对象时,他们不知道对象本身会被改变,对吗?那么这项工作会返回一些副作用?谢谢:)
hqt14年

如果不将NSMutableString *造型抛NSString *回造型,就无法修改造型NSMutableString *。如果方法的签名说它返回不可变,并且将其强制转换为可变,那么您就依赖于实现细节,并且(甚至更糟)是故意破坏了可变性协定,因此应对由此造成的任何损害负责。只要您遵守规则,它就是安全的。总是(99%)编码,就像您从未见过的.m文件一样,除了您当前所在的文件。好吧,实际上您应该知道,但您的代码却不知道。
2014年

4

NSMutableString是的子类NSString,因此您可以进行类型转换:

NSString *string = (NSString *)mutableString;

在这种情况下,string它将是的别名mutalbeString,但是如果您尝试在其上调用任何可变方法,编译器都会抱怨。

同样,您可以使用类方法创建一个新的NSString:

NSString *string = [NSString stringWithString:mutableString];

你能告诉我吗。如果他们只是返回NSString(实际上是NSMutableString,那么当用户修改NSString对象时,他们不知道对象本身会被更改,对吗?所以这项工作会返回一些副作用?谢谢:)
hqt 2014年

但是,如果底层可变字符串发生了更改(通过mutableString变量,实际上是否会更改不可变字符串的底层值?如果它们都是指向同一对象的指针,则似乎必须这样做。)
Tom Bogle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.