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

ios – BOOL属性KVC:这个行为是个bug吗?,第1张

概述似乎valueForKey:键的BOOL @property名称在64位和32位iOS系统上返回不同类型(并因此导致不同的 JSON序列化): 在32位(iPhone 4s模拟器): 8 * sizeof(void*) = 32boolProperty attributes: Tc,N,V_boolPropertyobj.boolProperty = YES[obj valueForKey: 似乎valueForKey:键的BOol @property名称在64位和32位iOS系统上返回不同类型(并因此导致不同的 JSON序列化):

在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),BOol is 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吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1029503.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存