BOOL属性KVC:这个行为是个bug吗?

时间:2016-03-02 22:48:43

标签: ios objective-c boolean kvc

对于密钥,valueForKey:的{​​{1}} BOOL名称似乎在64位和32位iOS上返回不同类型(因此导致不同的JSON序列化)系统:

在32位(iPhone 4s模拟器)上:

@property

在64位(iPhone 6模拟器)上:

8 * sizeof(void*) = 32
boolProperty attributes: Tc,N,V_boolProperty
obj.boolProperty = YES
[obj valueForKey:@"boolProperty"]: 1
[[obj valueForKey:@"boolProperty"] class]: __NSCFNumber
JSON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":1}
obj.boolProperty = NO
[obj valueForKey:@"boolProperty"]: 0
[[obj valueForKey:@"boolProperty"] class]: __NSCFNumber
JSON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":0}

代码:

8 * sizeof(void*) = 64
boolProperty attributes: TB,N,V_boolProperty
obj.boolProperty = YES
[obj valueForKey:@"boolProperty"]: 1
[[obj valueForKey:@"boolProperty"] class]: __NSCFBoolean
JSON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":true}
obj.boolProperty = NO
[obj valueForKey:@"boolProperty"]: 0
[[obj valueForKey:@"boolProperty"] class]: __NSCFBoolean
JSON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":false}

这是Xcode 7.2,iOS 9.2模拟器的全部内容。

引用this answer

,似乎可能是根本原因
  

备注:在64位iOS平台上(但不在64位OS X上),@interface TSTObject : NSObject @property (nonatomic, assign) BOOL boolProperty; @end […] NSLog(@"8 * sizeof(void*) = %lu", 8 * sizeof(void*)); objc_property_t boolProp = class_getProperty([TSTObject class], "boolProperty"); NSLog(@"boolProperty attributes: %s", property_getAttributes(boolProp)); void(^testBool)(BOOL) = ^(BOOL boolValue) { TSTObject *obj = [[TSTObject alloc] init]; id vfk; obj.boolProperty = boolValue; vfk = [obj valueForKey:@"boolProperty"]; NSLog(@"obj.boolProperty = %@", boolValue ? @"YES" : @"NO"); NSLog(@"[obj valueForKey:@\"boolProperty\"]: %@", vfk); NSLog(@"[[obj valueForKey:@\"boolProperty\"] class]: %@", [vfk class]); NSLog(@"JSON serialization of @{ @\"boolProperty\": [obj valueForKey:@\"boolProperty\"] }: %@", [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:@{@"boolProperty": vfk} options:0 error:NULL] encoding:NSUTF8StringEncoding]); }; testBool(YES); testBool(NO); 被定义为C99 BOOL,这是一个& #34;适当"布尔类型,只能取值0或1.

这是原因吗?

这是一个错误还是预期的行为?

1 个答案:

答案 0 :(得分:1)

是的,这就是原因。

是的,这是预期的行为。 (好吧,它在32位上串行化为JSON的方式并不特别"意图"但它是预期的。64位使用正确的Bool类型的事实是有用的。)

JSON序列化程序无法区分单字节有符号整数和32位布尔值之间的区别,因为它们实际上是相同的。