Le mélange de fonctions C Objective-C classe
Je suis en train d'écrire un Objectif-C classe mais il utilise une API écrite en C. C'est surtout l'amende que le mélange C appels avec Objective-C appels cause quelques problèmes.
Cependant, l'un de l'appel d'API nécessite un appel de retour de la méthode (exemple):
success = CFHostSetClient(host, MyCFHostClientCallBack, &context);
Où MyCFHostClientCallBack
est une fonction C définie comme ceci:
static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);
- Peuvent/Comment dois-je appeler un Objectif-C méthode à la place de cela?
- Peux/dois-je mélanger les les fonctions C avec mon Objective-C d'appels?
- Comment puis-je mélanger les les fonctions C avec Objectif-méthodes C?
Vous devez vous connecter pour publier un commentaire.
Mélange de C et Objective-C, les méthodes et la fonction est possible, voici un exemple simple qui utilise l'API SQLite dans une Application iPhone: (cours site)
C fonctions doivent être déclarées à l'extérieur de la
@implementation
en Objective-C (.m) fichier.Parce que la fonction C est en dehors de la
@implementation
il ne peut pas appeler des méthodes commeet n'a pas accès à ivars.
Cela peut être contourné aussi longtemps que la fonction de rappel prend un
userInfo
oucontext
paramètre de type, normalement de typevoid*
. Ceci peut être utilisé pour envoyer un Objectif-objet C de la fonction C.Comme dans le exemple de code, ce peut être manipulé avec normal Objective-C opérations.
En outre, veuillez lire cette réponse: Le mélange de fonctions C Objective-C classe
@implementation
.@implementation
, mais il n'est pas encore partie de la@implementation
, comme les fonctions ne peuvent pas appartenir à une classe. Comme une question de style, je le laisse en dehors de@implementation
, et de recommander aux autres de faire de même, pour que ce soit clair.À l'appel de code Objective-C à partir d'un C rappel je voudrais utiliser quelque chose comme:
void *userData
, assurez-vous de jeter un pointeur vers votre Objectif-C instance de classe avec(__bridge id)(userData)
pour éviter les avertissements et les fuites.Vous ne pouvez pas.
Oui. Écrire une fonction C et l'utiliser comme le rappel de la fonction FC.
Vous pouvez définir
self
comme leinfo
pointeur dans votre contexte de la structure. Qui sera passé à la fonction de rappel. Ensuite, dans le rappel, la fonte de lainfo
pointeur de retour àid
:Vous pouvez ensuite envoyer
self
messages. Vous ne pouvez toujours pas accéder directement aux variables d'instance, bien que, depuis une fonction C est en dehors de la@implementation
section. Vous aurez à faire leur propriétés. Vous pouvez le faire avec un extension de classe. (Contrairement à ce que le document dit, vous ne souhaitez pas déclarer l'extension à l'intérieur de@implementation
, mais dans le même fichier avec elle, généralement à droite au-dessus d'elle.)Ce que j'ai toujours trouvé utile dans cette situation est de faire l'Obj-C surcouche au dessus de l'API C. Mettre en œuvre ce que vous avez besoin de l'aide de fonctions C, et de construire une Objective-C classe (ou deux) sur le dessus de cela, c'est tout ce que le monde extérieur va voir. Par exemple, dans le cas d'un rappel comme cela, vous pourriez faire une fonction C qui appelle l'Obj-C déléguer des méthodes sur d'autres objets.