我正在編寫一個Objective-C類,但是它使用用C編寫的API。這很好,因為將C調用與Objective-C調用混合使用不會引起什么問題。但是,API調用之一需要回調方法(示例):success = CFHostSetClient(host, MyCFHostClientCallBack, &context);MyCFHostClientCallBackC函數定義在哪里:static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);我可以/如何調用Objective-C方法代替它?我可以/應該將C函數與我的Objective-C調用混合使用嗎?如何將C函數與Objective-C方法混合使用?
3 回答

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
要從C回調調用Objective-C代碼,我將使用類似以下內容的代碼:
void * refToSelf;
int cCallback()
{
[refToSelf someMethod:someArg];
}
@implementation SomeClass
- (id) init
{
self = [super init];
refToSelf = self;
}
- (void) someMethod:(int) someArg
{
}

胡子哥哥
TA貢獻1825條經驗 獲得超6個贊
我可以/如何調用Objective-C方法代替它?
你不能。
可以/應該在我的Objective-C調用中混用C函數嗎?
是。編寫一個C函數,并將其用作CF函數的回調。
如何將C函數與Objective-C方法混合使用?
您可以將其設置self為info上下文結構中的指針。這將傳遞給回調。然后,在回調中,將info指針轉換回id:
MyClass *self = (id)info;
然后,您可以發送self消息。但是,由于C函數在該@implementation部分之外,因此您仍然不能直接訪問實例變量。您必須將它們設置為屬性。您可以使用類擴展來做到這一點。(與該文檔相反,您不會在內聲明擴展名@implementation,而是在與擴展名相同的文件中聲明該擴展名,通常在其上方。)
- 3 回答
- 0 關注
- 697 瀏覽
添加回答
舉報
0/150
提交
取消