给定以下打包结构:
typedef struct __attribute__((packed)) {
BOOL flag;
int x;
} Foo;
以及以下类(class):
@interface Obj : NSObject
@property (nonatomic) Foo foo;
@end
@implementation Obj
@end
尝试在具有打包结构类型的属性上调用
valueForKey:
:Obj *obj = [Obj new];
id boo = [obj valueForKey:@"foo"];
导致
valueForKey:
内部崩溃(实际上它不是在 valueForKey:
内部崩溃,而是在随机位置崩溃,具体取决于月球大小,我猜是内存损坏)。如果我删除
__attribute__((packed))
它工作正常。有没有可能在不崩溃的情况下获取结构的数据?是苹果的bug吗?
附注。我确实需要在运行时执行此操作,即我不能直接调用
.foo
,我在运行时只有 @"foo"
字符串。 (我实际上想要实现的是递归打印对象内容)。 最佳答案
我不知道这对属性是否可行,但如果是,我认为您使用的语法不正确。
你有没有试过改变
id boo = [obj valueForKey:@"foo"];
阅读
Foo boo = obj.foo;
?
Foo 不是也永远不会是
id
。 valueForKey:
返回 id,并且运行时可能会尝试将 struct Foo
压缩到 NSValue
中。如果您出于某种原因需要使用
valueForKey:
,您的访问需要看起来像。Foo myFoo = FooFactory();
Object *myObj = [Object new];
[myObj setValue:@( myFoo ) forKey:@"foo"];
Foo myFooOut;
[[myObj valueForKey:@"foo"] getValue:&myFooOut];
//I bet `getValue:` is where things are barfing.
在这种情况下,如果
NSValue
的机器确实无法处理打包的结构,您只需要以老式的方式编写访问器:-<key>
和 -set:`。PS:永远不要将类命名为“Object”, 实际上在一些
Object
继承自的 SDK 中存在 NSObject
。我认为这只是在您的示例中。关于ios - valueForKey : on packed struct?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14776221/