Maison > développement back-end > C++ > Comment appeler une méthode Objective-C à partir d'une fonction membre C ?

Comment appeler une méthode Objective-C à partir d'une fonction membre C ?

Linda Hamilton
Libérer: 2024-12-07 11:04:15
original
979 Les gens l'ont consulté

How to Call an Objective-C Method from a C   Member Function?

Appel d'une méthode Objective-C à partir d'une fonction membre C

Problème

Une classe EAGLView nécessite d'appeler une fonction membre à partir d'une classe C sans problème . Cependant, au sein de la classe C, il est nécessaire d'appeler une fonction Objective-C, "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];", ce qui ne peut pas être réalisé en utilisant la syntaxe C pure.

Solution

Pour mélanger Objective-C et C, procédez avec prudence. Voici une approche étape par étape pour encapsuler l'appel Objective-C à l'aide d'une fonction wrapper C :

  1. Créer un en-tête d'interface C :

    • Créez un fichier d'en-tête nommé "MyObject-C-Interface.h" qui définit un wrapper C fonction.
#include <stdio.h> // for printf
#include <stdint.h> // for uintptr_t

typedef uintptr_t Id;

// Assume a simplified EAGLView class
extern void EAGLViewDoSomethingWith(Id* poself, void *aparam);

int MyObjectDoSomethingWith(void *myObjectInstance, void *parameter) {
    printf("C wrapper function called!\n");
    // Assuming Objective-C method takes a single int argument
    return EAGLViewDoSomethingWith(myObjectInstance, 21);
}
Copier après la connexion
  1. Définir la classe Objective-C :

    • Créer une fichier d'en-tête "MyObject.h" et fichier d'implémentation "MyObject.mm".
// MyObject.h
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
Copier après la connexion
// MyObject.mm
#import "MyObject.h"
@implementation MyObject
- (int)doSomethingWith:(void *)aParameter {
    // Implement Objective-C function
    return 42;
}
@end
Copier après la connexion
  1. Implémenter la classe C :

    • Incluez l'en-tête de l'interface C dans l'en-tête de la classe C "MyCPPClass.h" et utilisez le wrapper C fonction.
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};
Copier après la connexion
Copier après la connexion

Idiome PIMPL pour une implémentation orientée objet

L'idiome PIMPL (Pointer to Implementation) peut être utilisé pour une implémentation orientée objet :

  1. Définir un C Interface :

    • Créez un fichier d'en-tête "MyObject-C-Interface.h" qui définit une classe avec des méthodes wrapper.
#include <stdio.h> // for printf
#include <stdint.h> // for uintptr_t

typedef uintptr_t Id;

class MyClassImpl {
public:
    MyClassImpl() : self(nullptr) {}
    ~MyClassImpl() { if (self) dealloc(); }
    int doSomethingWith(void *parameter) { return 42; }
private:
    Id self;
    void dealloc() { if (self) free(self); }
};

int EAGLViewDoSomethingWith(Id* poself, void* aparam);

int MyObjectDoSomethingWith(void *myObjectInstance, void *parameter) {
    printf("C wrapper function called!\n");
    return EAGLViewDoSomethingWith(myObjectInstance, 21);
}
Copier après la connexion
  1. Créer une classe Objective-C Interface :

    • Définir un fichier d'en-tête "MyObject.h".
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
Copier après la connexion
  1. Créer une implémentation de classe Objective-C :

    • Définir un fichier d'implémentation "MyObject.mm" qui instancie une instance MyObject dans MyObject.
#import "MyObject.h"
@implementation MyObject {
    MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
    if (!_impl) _impl = [MyClassImpl new];
    return [_impl doSomethingWith:aParameter];
}
@end
Copier après la connexion
  1. Implémentez la classe C :

    • Incluez l'en-tête de l'interface C dans l'en-tête de classe C "MyCPPClass.h" et utilisez le fonction wrapper.
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};
Copier après la connexion
Copier après la connexion

Cette approche fournit une solution plus isolée et plus flexible, permettant de modifier l'implémentation Objective-C et le wrapper C sans affecter le code C.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal