给定以下打包结构:

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 不是也永远不会是 idvalueForKey: 返回 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/

10-11 14:53