Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memanggil Kaedah Objektif-C daripada Fungsi Ahli C?

Bagaimana untuk Memanggil Kaedah Objektif-C daripada Fungsi Ahli C?

Linda Hamilton
Lepaskan: 2024-12-07 11:04:15
asal
1047 orang telah melayarinya

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

Memanggil Kaedah Objektif-C daripada Fungsi Ahli C

Masalah

Kelas EAGLView memerlukan memanggil fungsi ahli daripada kelas C tanpa masalah . Walau bagaimanapun, dalam kelas C, timbul keperluan untuk memanggil fungsi Objektif-C, "[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];", yang tidak boleh dicapai menggunakan sintaks C tulen.

Penyelesaian

Untuk mencampurkan Objektif-C dan C , teruskan dengan berhati-hati. Berikut ialah pendekatan langkah demi langkah untuk membungkus panggilan Objektif-C menggunakan fungsi pembalut C:

  1. Buat Pengepala Antara Muka C:

    • Buat fail pengepala bernama "MyObject-C-Interface.h" yang mentakrifkan pembungkus C fungsi.
#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);
}
Salin selepas log masuk
  1. Tentukan Kelas Objektif-C:

    • Buat fail pengepala "MyObject.h" dan fail pelaksanaan "MyObject.mm".
// MyObject.h
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
Salin selepas log masuk
// MyObject.mm
#import "MyObject.h"
@implementation MyObject
- (int)doSomethingWith:(void *)aParameter {
    // Implement Objective-C function
    return 42;
}
@end
Salin selepas log masuk
  1. Melaksanakan Kelas C:

    • Sertakan pengepala antara muka C dalam pengepala kelas C "MyCPPClass.h" dan gunakan pembalut C fungsi.
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};
Salin selepas log masuk
Salin selepas log masuk

Idiom PIMPL untuk Pelaksanaan Berorientasikan Objek

Idiom PIMPL (Penunjuk kepada Pelaksanaan) boleh digunakan untuk pelaksanaan berorientasikan objek :

  1. Takrifkan C Antara Muka:

    • Buat fail pengepala "MyObject-C-Interface.h" yang mentakrifkan kelas dengan kaedah pembalut.
#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);
}
Salin selepas log masuk
  1. Buat Kelas Objektif-C Antara Muka:

    • Tentukan fail pengepala "MyObject.h".
@interface MyObject : NSObject
- (int)doSomethingWith:(void *)aParameter;
@end
Salin selepas log masuk
  1. Buat Kelas Objektif-C Perlaksanaan:

    • Tentukan fail pelaksanaan "MyObject.mm" yang membuat contoh MyObject dalam MyObject.
#import "MyObject.h"
@implementation MyObject {
    MyClassImpl* _impl;
}
- (int)doSomethingWith:(void *)aParameter {
    if (!_impl) _impl = [MyClassImpl new];
    return [_impl doSomethingWith:aParameter];
}
@end
Salin selepas log masuk
  1. Melaksanakan C Kelas:

    • Sertakan pengepala antara muka C dalam pengepala kelas C "MyCPPClass.h" dan gunakan fungsi pembalut C.
#include "MyObject-C-Interface.h"

class MyCPPClass {
public:
    void someMethod(void *objectiveCObject) {
        int result = MyObjectDoSomethingWith(objectiveCObject, nullptr);
    }
};
Salin selepas log masuk
Salin selepas log masuk

Pendekatan ini menyediakan penyelesaian yang lebih terpencil dan fleksibel, membolehkan pelaksanaan Objektif-C dan pembalut C diubah suai tanpa menjejaskan kod C.

Atas ialah kandungan terperinci Bagaimana untuk Memanggil Kaedah Objektif-C daripada Fungsi Ahli C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan