2009-10-08 7 views
2

Je me demande s'il est possible d'utiliser un NSArray/NSMuatbleArray avec des types C comme éléments, à savoir CGLayerRef?NSArray avec des types C?

Si vous ajoutez des objets CGLayerRef au NSMutableArray le code compile mais un avertissement est lancé:

avertissement: passage d 'arguments 1 de 'objectForKey:' fait pointeur de entier sans un casting

Donc ma question: Comment puis-je stocker des types C dans un tableau mutable?

Best,

heinrich

Répondre

9

Ceci est une réponse en plusieurs parties. En fin de compte, la réponse pour vous va être "vous pouvez le faire".

(1) NSArray ne peut pas gérer les types C généraux. Si vous êtes intéressé par ce genre de chose, CFArray peut être équipé de rappels personnalisés pour stocker d'autres types de données. Avertissement: Normalement, vous pouvez passer un CFArray à n'importe quelle API NSArray - ils sont pontés. Cela ne s'applique pas aux CFArrays avec des rappels personnalisés. (2) CGLayerRef n'est pas un ancien type C, c'est un CFType. CFType est lié à NSObject. Envoyer -retain et -release à tout CFType fonctionne exactement comme il le ferait sur un objet NSObject. Si vous deviez mettre une catégorie sur NSObject en implémentant -foo puis que vous transtypiez un certain CFType aléatoire en id et que vous lui envoyiez le message -foo, vous verriez votre implémentation de foo invoquée. Par conséquent, l'avertissement du compilateur est le seul problème à ce jour. Vous pouvez lancer vers (id) pour l'éviter. Tout cela est pris en charge.

Ken Ferry

Cadres cacao

8

Jetez un oeil à NSValue

Un objet NSValue est un simple conteneur pour un seul C ou Objective-C donnée. Il peut contenir n'importe lequel des types scalaires tels que int, float et char, ainsi que des pointeurs, des structures et des identifiants d'objets. Le but de cette classe est de permettre à des éléments de ces types de données d'être ajoutés à des collections telles que des instances de NSArray et NSSet, qui nécessitent que leurs éléments soient des objets. Les objets NSValue sont toujours immuables.

+0

ooooh qui est à portée de main –

1

NSMutableArray (ou l'un des types de conteneur NS d'ailleurs) ne peut stocker que les sous-classes NSObject. Malheureusement, ceci n'inclut pas les types de pointeurs C typiques, y compris CGLayerRef.

L'une mise en garde à cette question est « l'outil sans pontés » classes que vous pouvez lancer à partir de types C-pointeur à leurs équivalents NS-(par exemple, CFStringRef < ->NSString*), mais ces ponts sont clairement documentés et CGLayerRef ne semble pas en avoir un. Une autre chose à noter est que id dans Objective-C n'est pas la même chose qu'un pointeur, donc l'incantation entre ces deux types pour essayer et chausse un C-pointer dans un conteneur NS pourrait vous causer des ennuis.

Comme mentionné dans une autre réponse, vous pouvez utiliser NSValue pour envelopper votre C-pointeur et stocker le NSValue dans votre NSMutableArray.

Questions connexes