【问题标题】:Objective C: convert a NSMutableString in NSString目标 C:在 NSString 中转换 NSMutableString
【发布时间】:2011-04-07 15:22:03
【问题描述】:

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

【问题讨论】:

  • 从您最近(今天)的问题历史看来,您应该准备一本关于 Cocoa 的体面的书,以大致了解 ObjC 世界中的工作原理。 Aaron Hillegass 的书是一个很好的开始。另请查看cocoadevcentral.com 更多信息:发布基本相同问题(String->CSV)的六个略有不同的版本,我猜这个问题也与之相关,对您没有太大帮助。你只是在发垃圾邮件,让人们最终忽略你的问题。
  • 相反,如果提供的答案对您没有帮助,您应该为您的初始问题提供更多信息,并且人们会尝试提供更合适的答案。一旦答案解决了您的问题,请给它一个赞成票,然后单击绿色复选标记接受它。这样,其他有相同问题的用户可以更轻松地找到经过验证的解决方案,并且稍后会感谢您。它还增加了您首先实际获得答案的机会;)
  • 是的,你是对的,对不起....我会尽量减少压迫感

标签: objective-c nsstring nsmutablestring


【解决方案1】:

通过:

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;

使它看起来不可变,即使它实际上保持可变。
尽管声明返回不可变实例,但许多方法实际上返回可变实例。

【讨论】:

  • 好答案!对于最后一个解决方案,您不需要进行类型转换,因为 NSMutableString 继承自 NSString 并且您始终可以将子类的类型分配给它所继承的类型而编译器不会抱怨。
  • @Regexident 你能告诉我。如果他们只是简单地返回NSString(实际上是NSMutableString 那么当用户修改NSString 对象时,他们不知道对象本身会被改变,对吗?所以这项工作会返回一些副作用?谢谢:)
  • 无法修改冒充NSString *NSMutableString *,除非将其转换回NSMutableString *。如果一个方法的签名说它返回不可变并且您将其强制转换为可变,那么您依赖于实现细节并且(更糟糕的是)故意违反可变性合同,因此要对由此造成的任何损害负责。只要你遵守规则,它就是安全的。总是(99%)的代码就像您从未见过任何 .m 文件的内容一样,除了您现在所在的文件。好吧,实际上你应该(/可能)知道,但不是你的代码。
【解决方案2】:

NSMutableStringNSString 的子类,所以你可以直接对它进行类型转换:

NSString *string = (NSString *)mutableString;

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

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

NSString *string = [NSString stringWithString:mutableString];

【讨论】:

  • 你能告诉我吗。如果他们只是简单地返回 NSString (实际上是 NSMutableString 那么当用户修改 NSString 对象时,他们不知道对象本身会被改变,对吗?所以这项工作会返回一些副作用?谢谢 :)
  • 但是如果底层可变字符串发生了变化(通过 mutableString 变量,它实际上会改变不可变字符串的底层值吗?如果它们都是指向同一个对象的指针,看起来就像它必须要做的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2013-05-26
  • 2011-12-31
  • 2016-11-18
  • 2013-11-01
相关资源
最近更新 更多