[NSCFString stringValue]:发送到实例的无法识别的选择器

时间:2010-09-29 15:33:53

标签: iphone objective-c

我正在使用此代码查询核心数据并返回key的值,我存储的值如下:

 NSString *newName= @"test"; 
 [newShot setValue:newName forKey:@"shotNumber"]; 

我这样查询:

NSManagedObject *mo = [items objectAtIndex:0];  // assuming that array is not empty
  NSString *value = [[mo valueForKey:@"shotNumber"] stringValue];
  NSLog(@"Value : %@",value);

我正在崩溃这条消息:

  

[NSCFString stringValue]:发送到实例的无法识别的选择器,

有谁知道会从哪里来?

5 个答案:

答案 0 :(得分:34)

newName@"test"已经一个NSString。无需调用-stringValue将其转换为字符串。

NSString *value = [mo valueForKey:@"shotNumber"];

答案 1 :(得分:5)

我经常为NSString添加一个类别来处理这个问题:

@interface NSString(JB)
-(NSString *) stringValue;
@end

@implementation NSString(JB)
  -(NSString *) stringValue {
  return self;
}
@end

您可以将类似的类别添加到您希望以这种方式响应的其他类中。

答案 2 :(得分:4)

[mo valueForKey: @"shotNumber"]返回一个字符串,NSString(其中NSCFString是实现细节)不实现stringValue方法。

鉴于NSNumber 确实实施stringValue,我打赌你认为自己投入时NSStringmo NSNumber {{1}}。

答案 3 :(得分:3)

@"shotNumber"的值可能是NSString类型,它只是NSCFString的包装器。您需要做的是,使用stringValue方法代替description

答案 4 :(得分:0)

请注意,如果您尝试访问认为是其他内容但实际上是字符串的对象上的字符串属性,您也可能会遇到此问题。

在我的情况下,我认为我的Hydration对象实际上是水合作用,但通过isKindOfClass检查它的类我发现它是一个NSString并且意识到我错误地将它作为Hydration对象投射并且我的问题在链条上进一步撒谎。