【问题标题】:Writing struct into NSMutableArray将结构写入 NSMutableArray
【发布时间】:2012-01-31 11:22:27
【问题描述】:

我有一个在两个完全不同的地方处理的游戏对象。在 Contact Listener 中,我检查了一些条件,如果它们发生,我必须保存复杂数据的一个或多个部分。所以我决定使用结构。例如:

struct SomeStruct
{
    int value1;
    int value2;
    CGPoint value3;
    b2Vec2 value4;
};

typedef SomeStruct SomeStruct;

在游戏场景中,我遍历所有游戏对象,如果它的堆栈/数组不为空,请执行一些操作并擦除它。

在 Contact Listener 中,它从头开始重复。

由于执行顺序严格,我必须使用这种架构(方法必须在其他方法之后调用)。

我怀疑我需要 vector 或 NSMutableArray 之类的东西(我认为它不适用于 struct),所以 vector 可能是唯一的方法。

但不明白如何实现它。你能帮我一些代码/伪代码或链接到我可以找到解决方案的书/文章吗?

【问题讨论】:

    标签: objective-c arrays struct objective-c++


    【解决方案1】:

    Cocoa 为此提供了NSValue 类:

    这会创建一个可以添加到NSMutableArray 的对象:

    NSValue *someObj = [NSValue valueWithBytes:&myStruct objCType:@encode(SomeStruct)];
    

    您可以使用[someObj pointerValue] 访问一个void*,它代表您放入NSValue 的结构的地址。

    【讨论】:

    • 抱歉,无法理解如何获取/更改某些结构元素的值... :(
    • @maaboo 将void* 转换为指向您的结构的指针,并通过-> 运算符更改该结构的字段:((SomeStruct*)[someObj pointerValue])->value2 = 5
    【解决方案2】:

    这个问题有很多解决方案。

    1. 不要使用struct。 obj-c 类实际上与结构相同。
    2. 使用CFArray (CFArrayCreateMutable) 并将其作为指针放在那里。
    3. 使用带有 STL 向量的 C++ 类。
    4. 使用 C 数组 (SomeStruct[]) 并在需要时增加其长度。
    5. 使用带有链表的经典堆栈实现(每个结构都有一个指向下一个值的指针)。

    【讨论】:

    • 是的,可能只有变量的 Obj-C 类会有所帮助。我会尝试使用它。在这种情况下,我对内存管理有点困惑。
    • mallocfree :) 没什么复杂的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-12-01
    • 2016-01-26
    相关资源
    最近更新 更多