Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios BOOL property KVC:这种行为是错误吗?_Ios_Objective C_Boolean_Kvc - Fatal编程技术网

Ios BOOL property KVC:这种行为是错误吗?

Ios BOOL property KVC:这种行为是错误吗?,ios,objective-c,boolean,kvc,Ios,Objective C,Boolean,Kvc,在64位和32位iOS系统上,键名为valueForKey:且带有BOOL@属性的似乎会返回不同的类型(从而导致不同的JSON序列化): 在32位(iPhone 4s模拟器)上: 在64位(iPhone 6模拟器)上: 守则: @interface TSTObject : NSObject @property (nonatomic, assign) BOOL boolProperty; @end […] NSLog(@"8 * sizeof(void*) = %lu", 8 * size

在64位和32位iOS系统上,键名为
valueForKey:
且带有
BOOL
@属性的
似乎会返回不同的类型(从而导致不同的JSON序列化):

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

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

守则:

@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);
这些都是Xcode 7.2、iOS 9.2模拟器的功能

看来根本原因可能是,引述一下:

备注:在64位iOS平台上(但不是在64位OS X上),
BOOL
被定义为C99
\u BOOL
,这是一种“正确”的布尔类型,只能取0或1

这就是原因吗

这是错误还是预期行为?

是的,这就是原因

是的,这是故意的行为。(好吧,它在32位上序列化为JSON的方式并不是特别“有意”的,但这是意料之中的。64位使用正确的Bool类型这一事实是有意的。)


JSON序列化程序无法区分单字节带符号整数和32位布尔值之间的差异,因为它们事实上是一样的。

最简单的解决方案可能是在编码/解码JSON时处理包装原语的
NSNumber
实例。可以公平地说,32位iOS上的ObjC运行时无法区分
BOOL
属性和
signed char
属性吗?这是正确的,因为它们是一样的东西
BOOL
只是32位上有符号字符的类型别名。
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}
@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);