
在32位(iPhone 4s模拟器):
8 * sizeof(voID*) = 32boolProperty attributes: Tc,N,V_boolPropertyobj.boolProperty = YES[obj valueForKey:@"boolProperty"]: 1[[obj valueForKey:@"boolProperty"] class]: __NSCFNumberJsON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":1}obj.boolProperty = NO[obj valueForKey:@"boolProperty"]: 0[[obj valueForKey:@"boolProperty"] class]: __NSCFNumberJsON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":0} 在64位(iPhone 6模拟器)上:
8 * sizeof(voID*) = 64boolProperty attributes: TB,V_boolPropertyobj.boolProperty = YES[obj valueForKey:@"boolProperty"]: 1[[obj valueForKey:@"boolProperty"] class]: __NSCFBooleanJsON serialization of @{ @"boolProperty": [obj valueForKey:@"boolProperty"] }: {"boolProperty":true}obj.boolProperty = NO[obj valueForKey:@"boolProperty"]: 0[[obj valueForKey:@"boolProperty"] class]: __NSCFBooleanJsON 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); 这是Xcode 7.2,iOS 9.2模拟器的全部内容.
引用this answer可能导致根本原因:
Remark: On the 64-bit iOS platform (but not on 64-bit OS X),
BOolis defined as the C99_Bool,which is a “proper” boolean type and can take only the value 0 or 1.
这是原因吗?
这是一个错误还是预期的行为?
解决方法 是的,这就是原因.是的,这是预期的行为. (好吧,它在32位上串行化为JsON的方式并不是特别“预期”,但它是预期的.64位使用正确的Bool类型的事实是有用的.)
JsON序列化器无法区分单字节有符号整数和32位布尔值之间的区别,因为它们实际上是相同的.
总结以上是内存溢出为你收集整理的ios – BOOL属性KVC:这个行为是个bug吗?全部内容,希望文章能够帮你解决ios – BOOL属性KVC:这个行为是个bug吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)