Problemi con l'aggiunta di oggetti C ++ alle raccolte C oggettive (NSSET)
-
27-10-2019 - |
Domanda
Sono impegnato a implementare Zxing con un QRCodeReader nel mio progetto. QRCodeReader è principalmente C ++ e il mio progetto Objective-C. Sono riuscito a implementarlo correttamente in modo da poter usare gli oggetti QRCoderAder nella mia implementazione Objective-C (file .MM). Ma ora devo passare questo oggetto C ++ alla proprietà ZxWidController.Reader.
Ciò significa che dovrò impostare l'oggetto C ++ in un oggetto NSSET.
QRCodeReader* qrcodeReader = new QRCodeReader();
NSSet *readers = [[NSSet alloc ] init];
[readers setByAddingObject:(id)qrcodeReader];
widController.readers = readers;
[readers release];
Il codice sopra fa il trucco. Ho lanciato l'oggetto C ++ a (ID) e ora si compila correttamente. Ma è questo il modo corretto per farlo?
Questo modo di programmazione è il modo corretto per farlo?
Ci sono altri modi migliori per raggiungere il mio obiettivo?
Soluzione
Un tipo C ++ non è un tipo C oggettivo. Non è possibile inviarlo messaggi, in particolare trattenere e rilasciare, cosa che fa NSSET. Esiste un tipo C oggettivo lo stesso nome che si desidera utilizzare. (Aggiornerò l'altra mia risposta).
Altri suggerimenti
Il codice sopra fa il trucco. Ho lanciato l'oggetto C ++ a (ID) e ora si compila correttamente. Ma è questo il modo corretto per farlo?
No. Non puoi semplicemente fare un puntatore arbitrario in un puntatore oggettivo Objective-C valido lanciandolo su ID.
Questo modo di programmazione è il modo corretto per farlo?
Ancora una volta, no.
Ci sono altri modi migliori per raggiungere il mio obiettivo?
Puoi provare uno dei seguenti:
Ridefinire la tua classe ZxWidController per prendere un puntatore a un oggetto C ++ anziché a un oggetto OBJ-C.
Avvolgi QrCodeReader in un NSValue.
Dai un'occhiata a NSPOInterarray in sostituzione di NSSET. Sicuramente leggi i documenti prima di provare a usarlo: devi configurare le sue politiche di gestione della memoria per fare la cosa giusta per il tipo di puntatore che stai memorizzando.
Minor Nitpick: dimenticando per un momento sul fatto che QrCodeReader indica un oggetto C ++, sembra sciocco creare un set vuoto solo in modo da poter aggiungere un oggetto ad esso. Se stavi per utilizzare un set OBJ-C, crealo usando +setWithObject: o usa invece NSMutableSet.