NSNumber objCType EXC_BAD_ACCESS

NSNumber objCType EXC_BAD_ACCESS

我现在面临一个由NSNumber的objCType,即numberWithInt引起的情况。 当我从 NSUserDefault 检索它并检查它的类型时。 EXC_BAD_ACCESS 被解雇了。

代码如下:

 NSNumber* number = [uD objectForKey:@"some_key"];
 NSLog(@"Data Type %@",[number objCType]);//This Line fired EXC_BAD_ACCESS

uD代表在代码的另一部分初始化的UserDefault对象。 从 numberWithLong

创建 NSNumber 时不存在此问题

您不能在 NSLog 上使用带有 %@ 的 c 类型。您应该这样做以检查类型。

if (strcmp([number objCType], @encode(BOOL)) == 0) {
    NSLog(@"this is a bool");
} else if (strcmp([number objCType], @encode(int)) == 0) {
    NSLog(@"this is an int");
}

objCType returns 一个 C 字符串,因此您需要在格式字符串中使用 %s 而不是 %@。像这样:

NSLog(@"Data Type %s", [number objCType]);

请注意,您可能希望通过执行以下操作来防止 nil 值为 number

NSLog(@"Data Type %s", [number objCType] ?: "");