Objective-C中的Box自定义结构

时间:2012-10-29 16:23:19

标签: objective-c struct objective-c-literals

  

可能重复:
  How to wrap a Struct into NSObject
  Can the new Clang Objective-C literals be redirected to custom classes?

我有一个自定义结构:

typedef struct {
    float f1;
    float f2;
} MYCustomStruct;

我需要添加到NSArray。我已经写了一个类别来创建这些结构的NSValues,然后我将其添加到NSArray,但是如果可能的话,我想进一步使用盒装表达式来简化它。我很乐意能够做到这一点:

@[@(instanceOfMYCustomStruct)];

但是,我遇到了以下错误:

  

盒装表达中使用的非法类型'MYCustomStruct'

有没有办法使用带有自定义结构的盒装表达式?

1 个答案:

答案 0 :(得分:4)

我会使用NSValue来装箱结构,因为它内置了对它的支持。不幸的是,你不能使用objective-c的酷文字,但是:

struct foo myStruct;
NSValue *val = [NSValue valueWithBytes:&myStruct objCType:@encode(typeof(myStruct))];

// to pull it out...
struct foo myStruct;
[val getValue:&myStruct];

虽然这可能是笨重的&在其他objc代码中丑陋,你必须问自己 - 为什么你在Objective-C中首先使用struct?使用具有少量@property(s)的对象获得的速度性能很少,我能看到的唯一真正原因是,如果要与C库集成以与内存布局兼容,即使这样,结构也是如此一个Objective-c对象的内存布局是明确定义的,只要超类没有改变。

那么你在拳击结构中的真正目的是什么?如果我们有这个,我们可以帮助您。