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);
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.