【问题标题】:[NSConcreteValue floatValue]: unrecognized selector sent to instance[NSConcreteValue floatValue]:发送到实例的无法识别的选择器
【发布时间】:2019-10-14 12:20:42
【问题描述】:

在我的项目中我遇到了这个问题。

我有一个 NSDictionary,当我尝试调用一个值时,有时应用会崩溃,Xcode 会给我这个错误:

  • [NSConcreteValue floatValue]:发送到实例的选择器无法识别

这里是调用字典值的代码(值不是nil):

    float valueTest = [[change valueForKey:@"new"] floatValue];

编辑

这是我的 NSDictionary 的结构:

 {
    kind = 1;
    new = "0.02696711";
    old = "0.04064206";
}

字典永远不会等于 nil

方法是这样的:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
}

字典由系统创建。我用日志检查了字典的内容,它已经是正确的并且格式已经相同了。

我没有其他信息。

我正在寻找防止崩溃的方法。

抱歉可能出现英文错误

谢谢

【问题讨论】:

  • “The value is not nil” 不,但它也不是 NSNumber。这就是问题所在。
  • @matt 好的,但为什么有时它有效而有时无效?我必须如何更改我的代码?谢谢
  • @matt 我编辑了我的问题。我再说一遍,我的 NSDictionary 上的值永远不会等于 nil,键“new”中的值始终与浮点数相同
  • NSValue
  • @matt 我重新编辑了问题

标签: ios objective-c crash unrecognized-selector


【解决方案1】:

好的,看来我们正在尝试观察 AVCaptureDevice 的 ISO 属性。似乎有时它作为一个 NSValue 到达,而不是作为一个 NSNumber 键入。我不知道为什么会这样,但是您可以检查一下这种情况:

strcmp(@encode(float), [[change valueForKey:@"new"] objCType]) == 0

如果通过了,你可以直接提取值:

float f;
[[change valueForKey:@"new"] getValue:&f];

【讨论】:

  • 我做了一些测试,问题似乎解决了。谢谢马特
  • 很高兴工作。正如我所说,我不知道为什么浮点值被包装为 NSConcreteValue。这可能是一个 KVO 错误。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多