gpt4 book ai didi

ios - 键值 : on packed struct?

转载 作者:可可西里 更新时间:2023-11-01 06:16:06 25 4
gpt4 key购买 nike

给定以下打包结构:

typedef struct __attribute__((packed)) {
BOOL flag;
int x;
} Foo;

还有下面的类:

@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)) 它工作正常。有没有可能在不崩溃的情况下获取结构的数据?是 Apple 的 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 - 键值 : on packed struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14776221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com