BOOL KVC property: is this behavior an error?

It looks like the valueForKey:name BOOL @propertyfor the key returns different types (and therefore leads to different JSON serialization) on 64-bit and 32-bit iOS systems:

On 32-bit (iPhone 4s simulator):

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}

In 64-bit (iPhone 6 simulator):

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}

The code:

@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);

That's all with Xcode 7.2, iOS 9.2.

It seems that the main reason is to quote this answer :

Note. On a 64-bit platform, iOS (but not on a 64-bit OS X) BOOLis defined as C99 _Bool, which is the "correct" Boolean type and can only accept the value 0 or 1.

This is the reason?

Is this a mistake or an alleged behavior?

+4
1

, .

, . (, , JSON 32-, "", . , 64- Bool, .)

JSON boolean 32-, .

+1

All Articles