【问题标题】:C++ / Objective-C++ - How can I store a C++ variable in an NSDictionary?C++ / Objective-C++ - 如何在 NSDictionary 中存储 C++ 变量?
【发布时间】:2014-02-24 15:34:39
【问题描述】:

我有一个std::vector<std::bitset<128> > 类型的C++ 变量,它在C++ 类中定义和填充(从我的Objective-C++ 类中调用。)

我想将此对象存储在NSDictionary - 或类似的对象中。我显然不能简单地将std::vector<std::bitset<128> > 添加到NSDictionary,因为它不是id 类型。

所以我的问题是:我怎样才能实现相同的概念? 如何将std::vector<std::bitset<128> > 存储在各种字典中? 我可以以某种方式将矢量对象包装在 id 类型中吗?即使它不是直接字典,我可以使用另一种方法吗?我还需要它是可变的,所以我可以在运行时添加键/对象。

我见过std::map<std::string, std::string>,但我不确定它是否是我要找的。我也没有发现任何关于它是可变的例子。

有谁知道如何做到这一点?

【问题讨论】:

    标签: c++ objective-c dictionary vector


    【解决方案1】:

    实际上NSValue 似乎是解决方案。 @Taum 的建议在某些情况下是正确的(当您将对象存储在某处并确保您的指针正常工作时)。如果您创建了一些对象并且它的生命周期是有限的,但您需要进一步推动这个对象,请使用另一个 NSValue 方法

    std::vector<std::bitset<128>> cppVector;
    NSValue *value=[NSValue valueWithBytes:&cppVector objCType:@encode(std::vector<std::bitset<128>>)];
    

    当你需要取回这个值时:

    std::vector<std::bitset<128>> cppVector;
    [value getValue:&cppVector];
    

    这也适用于简单的结构。

    【讨论】:

    • 我可以得到第一个对象,但接下来我得到:malloc: *** error for object 0x16f9a8288: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug
    • @user924 看看next 对象被创建的地方,它在更远的地方被释放了。
    • @Astoria 他们都在一个函数中创建
    • @user924 大概有两种情况: 1. 已经发布了。 2. 没有分配。
    【解决方案2】:

    您可以将指向它的指针存储在NSValue 对象中。您只需要注意拥有std::vector 的对象以及何时应该是free'd。

    存放于:

    std::vector<std::bitset<128>> *cppVector = myCppObject->methodReturningVector();
    NSValue *value = [NSValue valueWithPointer:cppVector];
    [myObjcDictionary setObject:value forKey:@"myKey"];
    

    通过以下方式获取 C++ 对象:

    NSValue *value = [myObjcDictionary objectForKey:@"myKey"];
    std::vector<std::bitset<128>> *cppVector = [value pointerValue]
    

    【讨论】:

    • 我的 C++/ObjC++ 有点生疏,但我编辑了答案以尝试给出一些代码示例。希望对您有所帮助。
    • 不幸的是,这似乎不起作用。我没有像您的示例那样为我的cppVector 返回指针。所以我可以使用NSValue *value = [NSValue valueWithPointer:&amp;cppVector] 来修复它,但是我似乎无法使用[value pointerValue] 来检索它。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多