Problème avec l'ajout d'objets C ++ pour objectif collections C (NSSet)
-
27-10-2019 - |
Question
Je suis occupé avec la mise en œuvre ZXing un QRCodeReader dans mon projet. QRCodeReader est principalement C ++ et mon projet Objective-C. J'ai réussi à le mettre en œuvre correctement pour que je puisse utiliser les objets QRCodeReader dans ma mise en œuvre objective-C (fichier .mm). Mais maintenant, je dois passer cet objet C ++ à la propriété zxWidController.reader.
Cela signifie que je devra définir l'objet C ++ dans un objet NSSet.
QRCodeReader* qrcodeReader = new QRCodeReader();
NSSet *readers = [[NSSet alloc ] init];
[readers setByAddingObject:(id)qrcodeReader];
widController.readers = readers;
[readers release];
Le code ci-dessus fait l'affaire. Je Casted l'objet C de la (id) et maintenant il compile correctement. Mais est-ce la bonne façon de le faire?
est cette manière de programmer la bonne façon de le faire?
Y at-il d'autres / meilleures façons d'atteindre mon objectif?
La solution
Le type d'un C est pas un type Objective C. Vous ne pouvez pas envoyer des messages, en particulier de retenir et de libérer, ce qui fait NSSet. Il y a un type Objectif C du même nom que vous souhaitez utiliser. (Je vais mettre à jour mon autre réponse).
Autres conseils
Le code ci-dessus fait l'affaire. Je Casted l'objet C de la (id) et maintenant il compile correctement. Mais est-ce la bonne façon de le faire?
Non. Vous ne pouvez pas simplement faire un pointeur arbitraire dans un pointeur d'objet Objective-C valide par coulée à id.
est cette manière de programmer la bonne façon de le faire?
Encore une fois, non.
Y at-il d'autres / meilleures façons d'atteindre mon objectif?
Vous pouvez essayer une des opérations suivantes:
-
Redéfinir votre classe zxWidController prendre un pointeur vers un objet C ++ au lieu d'un objet Obj-C.
-
Wrap qrcodeReader dans un NSValue.
-
Jetez un oeil à NSPointerArray en remplacement de NSSet. Certainement lire les documents avant d'essayer de l'utiliser -. Vous devez configurer ses polices de gestion de mémoire pour faire la bonne chose pour le type de pointeur de stockage que vous êtes la
Mineure pinailler: Oublier un instant sur le fait que les points qrcodeReader à un objet C ++, il semble stupide de créer un ensemble vide juste pour que vous pouvez ajouter un objet à lui. Si vous allez utiliser un ensemble Obj-C, puis créez soit à l'aide de + setWithObject:. Ou utiliser NSMutableSet à la place