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
991 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!

sumber:php.cn
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