- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
似乎 valueForKey:
带有 BOOL
@property
键的名称返回不同的类型(因此,导致不同的 JSON 64 位和 32 位 iOS 系统上的序列化):
在 32 位(iPhone 4s 模拟器)上:
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}
在 64 位(iPhone 6 模拟器)上:
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);
这一切都与 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 位 boolean 值之间的区别,因为它们实际上是相同的东西。
关于ios - BOOL 属性 KVC : is this behavior a bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35759758/
我在我的代码中使用了 kvc。 [self addObserver:self forKeyPath:@"type" options:NSKeyValueObservingOptionNew |
@interface MyClass: NSObject @property NSArray *arr; @end @inplementation MyClass - (instancetype) i
作为 Cocoa 和 Objective-C 的新手,我对 KVC 和 KVO 有初步的了解。然而,关于 Cocoa 绑定(bind)(如标题为“Cocoa 绑定(bind)编程主题”的 Apple
我有一组从核心数据中选择的对象。我需要从这组对象子集中选择与条件相对应的对象。怎么做? 最佳答案 如果我没理解错的话,您想根据数组中某些对象满足的条件来过滤数组吗? 您可以通过使用 NSPredica
我创建类: @interface KVOGame : NSObject @property (nonatomic, strong) NSString *name; @property (nonatom
我有一个可绑定(bind)协议(protocol) protocol Bindable: class { associatedtype ObjectType: Any associat
以下哪个更快,为什么? CGFloat sum = 0; for (UIView *v in self.subviews) sum += v.frame.size.height; 或 CGFl
如果接收器类符合 NSKeyValueProtocol,则可以选择走很远的路: [myInstance setValue:[NSNumber numberWithInt:2] forKey:@"int
我经常需要检索属于 Set 的第一个对象。 (使用该对象作为该集合的代表。) 我设想了一个集合对象运算符,类似于 @unionOfObjects 但是很明显 @firstObject 是否可以创建这样
我正在尝试让我的头脑专注于“键值编码”。 Apple's docs say: This document describes the NSKeyValueCoding informal protoco
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我正在尝试向我的可重用单元添加一个观察者,问题是它添加了多个观察者。所以我想知道是否有什么办法可以解决这个问题,因为我真的需要这个观察者。 var player: AVPlayer? var post
我想解析 XML 以填充符合 KVC 的对象,但是,我的解析器非常笨,它只是从 XML 属性/标签组装 NSStrings 并尝试通过 KVC 设置它们。 这适用于实际的字符串和数字(我相信),但
我正在尝试观察收藏笔记。这是代码: -(void) registerNotesHeaderViewChangeNotification { [self.selectedVegetableGar
我使用此代码通过我的可变数组订阅事件: [RACObserve(self, marray) subscribeNext:^.... 我是 RAC 的新手,我不明白为什么,例如,如果我使用: NSMut
我有例如我的 NSArray 中有 5 个 MyFile 对象。这 5 个对象中的每一个都具有属性 path。 MyFile *myFile ...; NSString path = myMyFile
这是代码: NSNumber *taskId = [[self.taskList objectAtIndex:indexPath.row] valueForKey:@"identity"]; N
有一个例子如下: enum Gender{ case male case female } class Person:NSObject{ var name: String?
我正在尝试了解 Swift 4 的最新添加 - better KVC .在 Playground 上放这个简单的东西什么也打印不出来 class Foo { var name: String
我读过Marcus S. Zarra的iOS相关章节Core Data: Data Storage and Management for iOS, OS X, and iCloud (第 2 版)受益
我是一名优秀的程序员,十分优秀!