Misturando funções C em uma class Objective-C

Eu estou escrevendo uma class Objective-C, mas ele usa uma API escrita em C. Isso é muito bem como misturar chamadas C com chamadas Objective-C causa poucos problemas.

No entanto, uma das chamadas da API requer um método de retorno (exemplo):

success = CFHostSetClient(host, MyCFHostClientCallBack, &context); 

Onde MyCFHostClientCallBack é uma function C definida como esta:

 static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info); 
  1. Can / Como eu chamo um método Objective-C no lugar disso?
  2. Posso / devo misturar funções C com minhas chamadas Objective-C?
  3. Como eu misturo funções C com methods Objective-C?

A mistura de methods e funções C e Objective-C é possível, aqui está um exemplo simples que usa a API SQLite dentro de um aplicativo para iPhone: ( site do curso )

Faça o download do arquivo Zip (09_MySQLiteTableView.zip)

C funções precisam ser declaradas fora do @implementation em um arquivo Objective-C (.m).

 int MyCFunction(int num, void *data) { //code here... } @implementation - (void)MyObjectiveCMethod:(int)number withData:(NSData *)data { //code here } @end 

Porque a function C está fora do @implementation ele não pode chamar methods como

 [self doSomething] 

e não tem access a ivars.

Isso pode ser contornado desde que a function de retorno de chamada userInfo um parâmetro userInfo ou de tipo de context , normalmente do tipo void* . Isso pode ser usado para enviar qualquer object Objective-C para a function C.

Como no código de exemplo , isso pode ser manipulado com operações normais do Objective-C.

Além disso, por favor, leia esta resposta: Misturando funções C em uma class Objective-C

Para chamar o código Objective-C de um retorno de chamada C, eu usaria algo como:

 void * refToSelf; int cCallback() { [refToSelf someMethod:someArg]; } @implementation SomeClass - (id) init { self = [super init]; refToSelf = self; } - (void) someMethod:(int) someArg { } 

Can / Como eu chamo um método Objective-C no lugar disso?

Você não pode.

Posso / devo misturar a function C com a minha chamada Objective-C?

Sim. Escreva uma function C e use-a como retorno de chamada para a function CF.

Como eu misturo a function C com os methods Objective-C?

Você pode definir self como o ponteiro de info em sua estrutura de contexto. Isso será passado para o retorno de chamada. Em seguida, no retorno de chamada, casting o ponteiro de informao de volta para id :

 MyClass *self = (id)info; 

Você pode então enviar mensagens self . Você ainda não pode acessar diretamente as variables ​​de instância, uma vez que uma function C está fora da seção @implementation . Você terá que torná-los propriedades. Você pode fazer isso com uma extensão de class . (Ao contrário do que o documento diz, você não declararia a extensão dentro de @implementation , mas no mesmo arquivo com ela, geralmente logo acima dela.)

O que eu sempre achei útil nessa situação é fazer um wrapper Obj-C no topo da API C. Implemente o que você precisa usando funções C e construa uma class Objective-C (ou duas) sobre ela, de modo que tudo que o mundo externo verá. Por exemplo, no caso de um retorno de chamada como este, você pode fazer uma function C que chama methods delegates Obj-C em outros objects.