【问题标题】:Cocoa: NSMutableString gives warning with stringValueCocoa:NSMutableString 使用 stringValue 发出警告
【发布时间】:2010-01-19 08:33:07
【问题描述】:

这行得通:

NSString *myVar = @"whatever"; 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];

myVar = [myNum stringValue];

这个带有可变字符串的版本会产生警告“assignment from distinct Objective-C type”:

NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"];  //UPDATE: CORRECTED CODE

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];

myVar = [myNum stringValue];

在这两种情况下,stringValue 都返回一个 NSCFString。不可变的 NSString 变量不关心,可变的 NSMutableString 抱怨。

附:有人请为 NSMutableString 和 stringValue 添加标签。

【问题讨论】:

  • 你能发布给定的警告吗?
  • (啊,我可以发布 cmets,因为我还在 cookied 中......)。 Laurent,这只是一个黄色 Xcode 警告:“警告:来自不同 Objective-C 类型的赋值”。
  • 菲利普和弗拉基米尔的回答已经解释了这种情况。问题是 stringValue 对象是不可变的,因此不能分配给可变字符串变量。 (Vladimir 还指出我的 NSMutableString *myVar = @"whatever"; 代码本质上是非法的,但不会产生相关警告。)谢谢!
  • 我实际上只是从 NSMutableString *myVar = @"whatever"; 中更正了我的原始代码。到弗拉基米尔的正确语法 NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"];以避免混淆导致错误的原因。

标签: objective-c cocoa nsstring nsmutablestring


【解决方案1】:

-stringValue 返回自动释放的 NSString 实例,即不可变对象。即使您将它分配给可变字符串指针,它也不会使字符串可变并且您将无法在其上调用可变字符串方法(顺便说一句,对于您的第一个代码也是如此):

NSMutableString* tStr = @"lala";
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object

正确的处理方法是用方便的方法创建可变字符串:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK 

【讨论】:

  • 或者你可以使用[aString mutableCopy]
  • 请注意,根据 Vladimir 的评论,我已更正原始帖子中的代码以显示最初创建的正确 NSMutableString。
  • 当你分配一个字符串时:myVar = [myNum stringValue];您丢弃所有以前的分配 - 您以前如何创建字符串无关紧要,现在 myVar 包含 -stringValue 的结果并且以前的值丢失了。
  • 请记住,-mutableCopy 将返回一个保留计数为 +1 的对象,而不是自动释放。如果您碰巧已经有一个可变字符串,那么使用 -[NSMutableString setString:] 会更干净,而且可能更快。
  • 你也可以向字面量发送消息:NSMutableString *tStr = [@"lala" mutableCopy];
【解决方案2】:

[myNum stringValue] 返回一个 NSString,而不是 NSMutableString,所以这会产生警告。

如果您稍后尝试操作 myVar 的实例(假设它是一个可变字符串),您会得到一个异常,因为该对象根本不是一个可变字符串。

【讨论】:

    【解决方案3】:

    您不能简单地将不可变字符串分配给NSMutableString * 类型的变量来将其变为可变字符串。你所做的基本上是:

    NSString *immutableStr = @"Mayonnaise";
    NSMutableString *mutableStr = immutableStr;
    

    在这种情况下,两个变量都指向完全相同的常量字符串对象(指针将比较相等)。您还将收到一条警告,因为您正尝试使用不兼容的 NSString * 类型的值设置 NSMutableString * 类型的变量。它是不兼容的,因为NSMutableString * 提供了NSString * 没有的方法和行为,所以当你尝试使用NSMutableString 的行为时,你会得到运行时错误,因为变量指向的实际对象不是NSMutableString.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多