簡體   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