Objective-C结构属性的键值编码

时间:2013-04-11 20:17:19

标签: ios objective-c macos key-value-coding

根据Apple的文档Key-Value Coding Programming Guide,您可以在struct属性上调用valueForKey:和setValue:forKey:它们应该自动包装在NSValue对象中。我发现当我在NSDecimal上进行此调用时,我收到以下错误:

-[NSInvocation getArgument:atIndex:]: struct with unknown contents found while getting argument at index -1

任何人都可以了解应如何做到这一点吗?或者KVO在这种情况下被破坏了......

1 个答案:

答案 0 :(得分:4)

键值编码似乎不适用于包含位域的结构。 所以对于这个测试类

typedef struct { int a; int b; } mystruct1;
typedef struct { int a:4; int b:4; } mystruct2;

@interface MyClass : NSObject
@property (nonatomic) mystruct1 s1;
@property (nonatomic) mystruct2 s2;  // struct with bit fields
@end

以下工作,并返回NSValue对象:

MyClass *o = [[MyClass alloc] init];
mystruct1 s1 = { 4, 5 };
o.s1 = s1;
NSValue *v1 = [o valueForKey:@"s1"];

但是包含位字段的结构的相同代码崩溃完全相同 在你的问题中留言:

mystruct2 s2 = { 4, 5 };
o.s2 = s2;
NSValue *v2 = [o valueForKey:@"s2"]; // --> NSInvalidArgumentException

由于NSDecimal包含位字段,因此解释了问题。