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] ?: "");
我现在面临一个由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] ?: "");