Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios valueForKey:在压缩结构上?_Ios_Objective C_Struct - Fatal编程技术网

Ios valueForKey:在压缩结构上?

Ios valueForKey:在压缩结构上?,ios,objective-c,struct,Ios,Objective C,Struct,给定以下压缩结构: typedef struct __attribute__((packed)) { BOOL flag; int x; } Foo; Obj *obj = [Obj new]; id boo = [obj valueForKey:@"foo"]; 以及以下类别: @interface Obj : NSObject @property (nonatomic) Foo foo; @end @implementation Obj @end 试图对具有压缩结构类

给定以下压缩结构:

typedef struct __attribute__((packed)) {
    BOOL flag;
    int x;
} Foo;
Obj *obj = [Obj new];
id boo = [obj valueForKey:@"foo"];
以及以下类别:

@interface Obj : NSObject
@property (nonatomic) Foo foo;
@end

@implementation Obj
@end
试图对具有压缩结构类型的属性调用
valueForKey:

typedef struct __attribute__((packed)) {
    BOOL flag;
    int x;
} Foo;
Obj *obj = [Obj new];
id boo = [obj valueForKey:@"foo"];
导致
valueForKey:
内部崩溃(实际上它不是在
valueForKey:
内部崩溃,而是在随机位置崩溃,具体取决于月亮的大小,我猜是内存损坏)

如果我删除
\uuuuu属性(打包))
它可以正常工作。 有没有可能在不崩溃的情况下获取struct的数据?是苹果的臭虫吗


另外,我确实需要在运行时这样做,也就是说,我不能直接调用
.foo
,我在运行时只有
@“foo”
字符串。(实际上,我试图实现的是递归打印对象内容)。

针对您的用例避免使用KVO,并坚持使用方便的dandy
标题。您可以使用这种内省重新实现KVO的一个基本部分。结构打包主要用于确保编译器没有正确对齐内部字段,以便CPU在执行期间不需要在硬件级别处理它。在这个时代,最好让编译器为您处理事情


如果您真的喜欢这种结构打包(如您所说,在网络传输场景中),我需要进一步的信息来确定问题所在。可能试图更改
@属性(非原子)Foo-Foo
@属性(非原子)NSValue*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
的机器确实无法处理打包结构,那么您只需以老式的方式编写访问器:
-
和-set:`


PS:永远不要将一个类命名为“Object”在一些SDK中实际上有一个
对象
,它是
NSObject
继承的。我想这只是你的例子。

“这是苹果的bug吗?”听起来很有可能。“在当今时代,最好让编译器替你处理事情。”-不幸的是,我不能;)。我正在从/向网络获取/发送这些结构,因此它们应该被精心打包以匹配网络协议…@ivanzoid仅仅因为这是在网络上使用的数据结构并不意味着您需要在程序中使用该结构。您应该使用编组来从内部表示转换为外部表示,特别是如果您关心endianness(在移植到big-endian系统时会这样做)。@trojanfoe这将为我增加更多的工作:D幸运的是,我们的网络协议endianness与iOS endianness匹配(因此,little-endian)“我打赌
getValue:
就是事情发生的地方。”-不,我甚至没有触摸从
valueForKey:
返回的对象。我已经更新了代码,现在是复制崩溃的完整代码(
valueForKey:
部分可以从模板iOS项目中的
viewDidLoad
调用)。