在将我的C ++数据模型连接到我的Cocoa表列UI时,我想知道是否可以在id(标识符)处向initWithIdentifier提供C ++类实例
// 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 ++模型之间的连接。
答案 0 :(得分:4)
C ++对象指针不能存储在id
类型变量中。在Objective-C中,id
是指向未知类型的Objective-C对象的指针。由于C ++对象不是Objective-C对象,因此将指针存储到id
中的C ++对象是不安全的。
解决方案是向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();