将C ++对象添加到Objective C集合(NSSet)的麻烦

时间:2011-10-20 13:28:08

标签: c++ objective-c qr-code zxing

我正忙着在我的项目中使用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),现在它正确编译。但这是正确的方法吗?

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

有没有其他/更好的方法来实现我的目标?

2 个答案:

答案 0 :(得分:3)

C ++类型不是Objective C类型。你不能发送消息,特别是保留和释放NSSet。您想要使用与您名称相同的Objective C类型。 (我会更新我的其他答案)。

答案 1 :(得分:1)

  

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

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

  

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

再次,不。

  

有没有其他/更好的方法来实现我的目标?

您可以尝试以下任何一项:

  • 重新定义zxWidController类,以获取指向C ++对象而不是Obj-C对象的指针。

  • 在NSValue中包装qrcodeReader。

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

轻微的挑剔:忘了qrcodeReader指向C ++对象这一事实,创建一个空集似乎很愚蠢,以便你可以添加一个对象。如果您打算使用Obj-C集,则使用+ setWithObject:创建它,或者使用NSMutableSet。