【问题标题】:Can I use a C++ Class Instance as an Objective-C++ id?我可以使用 C++ 类实例作为 Objective-C++ id 吗?
【发布时间】:2013-12-02 02:27:32
【问题描述】:

在将我的 C++ 数据模型连接到我的 Cocoa 表列 UI 时,我想知道是否可以将 ID(标识符)处的 C++ 类实例提供给 initWithIdentifier

// what magic needs to occur to create an id from a CPP class?
id someIDMadeFromAClassInstance = a_ptr_to_a_cpp_class_instance;

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

这样做的重点是,当调用 NSTable 的数据源方法 objectValueForTableColumn 时,我可以检索 id 并以某种方式将其转换回有效的 C++ 类实例:

id columnIdentifer = [aTableColumn identifier];

MyCPPClass* pAValidClass = [someMagicOnTheID columnIdentifer];

pAValidClass->AClassMethod();

我猜有一种更传统的方法可以做到这一点,但我想简化 Cocoa UI 和纯 C++ 模型之间的连接。

【问题讨论】:

    标签: c++ cocoa objective-c++ nstablecolumn


    【解决方案1】:

    C++ 对象指针不能存储在id 类型变量中。在 Objective-C 中,id 是一个指向未知类型的 Objective-C 对象的指针。由于 C++ 对象不是 Objective-C 对象,因此将指向 C++ 对象的指针存储在 id 中是不安全的。

    解决方案是向您的 Objective-C 类添加一个属性,该属性将存储一个 C++ 对象指针。如果您必须使用id,您可以创建一个包含存储 C++ 对象指针的属性的 Objective-C 类,例如:

    @interface MyCPPClassWrapper : NSObject
    
    @property (nonatomic, assign) MyCPPClass *myCPPClass;
    
    @end
    
    // ...
    
    MyCPPClassWrapper *wrapper = [[MyCPPClassWrapper alloc] initWithMyCPPClass:myCPPClass];
    
    // Hand wrapper off to your NSTable
    

    也请查看NSValue。它为 C 风格的指针提供了一种存储机制。对于 NSValue,你可以这样做:

    NSValue *someIDMadeFromAClassInstance = [NSValue valueWithPointer:a_ptr_to_a_cpp_class_instance];
    
    NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];
    
    // ...
    
    NSValue *columnIdentifer = (NSValue *)[aTableColumn identifier];
    MyCPPClass* pAValidClass = (MyCPPClass *)[columnIdentifer pointerValue];
    pAValidClass->AClassMethod();
    

    【讨论】:

    • NSValue 不会正确调用 C++ 对象的特殊方法。
    • NSValue 将充当weak_ptr(没有提供诸如过期等方法的安全性),因为在这种情况下,它是一个包装器,充当C++ 指针域和Objective-C 指针域之间的桥梁。我强烈建议使用我的第一个选项,因为它使程序员能够控制并添加特殊方法来确定指针是否无效(过期)。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多