繁体   English   中英

将C ++对象添加到Objective C集合(NSSet)时遇到问题

[英]Trouble with adding C++ objects to Objective C collections (NSSet)

我正在将QRCodeReader的ZXing实施到我的项目中。 QRCodeReader主要是C ++,而我的项目目标是C。 我已经设法正确实现它,因此可以将QRCodeReader对象用于我的Objective-C实现(.mm文件)。 但是现在我需要将此C ++对象传递给zxWidController.reader属性。

这意味着我将不得不将C ++对象设置为NSSet对象。

QRCodeReader* qrcodeReader = new QRCodeReader();
NSSet *readers = [[NSSet alloc ] init];
[readers setByAddingObject:(id)qrcodeReader];
widController.readers = readers;
[readers release];

上面的代码可以解决问题。 我将C ++对象转换为(id),现在可以正确编译了。 但这是正确的方法吗?

这种编程方式是执行此操作的正确方法吗?

还有其他/更好的方法可以实现我的目标吗?

C ++类型不是Objective C类型。 您不能向其发送消息,尤其是保留和释放,NSSet会这样做。 您要使用同名的Objective C类型。 (我将更新其他答案)。

上面的代码可以解决问题。 我将C ++对象转换为(id),现在可以正确编译了。 但这是正确的方法吗?

不能您不能通过将任意指针转换为id来使其成为有效的Objective-C对象指针。

这种编程方式是执行此操作的正确方法吗?

再说一次

还有其他/更好的方法可以实现我的目标吗?

您可以尝试以下任何一种方法:

  • 重新定义您的zxWidController类以采用指向C ++对象而不是Obj-C对象的指针。

  • 将qrcodeReader包装在NSValue中。

  • 看一下NSPointerArray作为NSSet的替代品。 在尝试使用文档之前,请务必阅读文档-必须配置它的内存管理策略,才能对要存储的指针类型做正确的事情。

次要nitpick:暂时忘记qrcodeReader指向C ++对象这一事实,创建一个空集只是为了可以向其添加对象,这似乎很愚蠢。 如果要使用Obj-C集,请使用+ setWithObject:创建它,或者改用NSMutableSet。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM