Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mixing C functions in an Objective-C class

I am writing an Objective-C class but it uses an API written in C. This is mostly fine as mixing C calls with Objective-C calls causes few problems.

However one of the API call requires a call back method (example):

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

Where MyCFHostClientCallBack is a C function defined like this:

static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info); 
  1. Can/How do I call an Objective-C method in place of this?
  2. Can/Should I mix C functions with my Objective-C calls?
  3. How do I mix C functions with Objective-C methods?
like image 543
Richard Stelling Avatar asked Apr 29 '09 11:04

Richard Stelling


People also ask

Can you use C in Objective-C?

You really can't use C in Objective-C, since Objective-C is C. The term is usually applied when you write code that uses C structures and calls C functions directly, instead of using Objective-C objects and messages.

Which is faster C or Objective-C?

Calling a C function is about 3-6 times faster than calling an Obj-C method, so how can they be equally fast? They can only be equally fast if you never call methods in Obj-C but that some defies the purpose of using Obj-C.

What is Objective-C function and?

Advertisements. A function is a group of statements that together perform a task. Every Objective-C program has one C function, which is main(), and all of the most trivial programs can define additional functions. You can divide up your code into separate functions.


2 Answers

Mixing C and Objective-C methods and function is possible, here is a simple example that uses the SQLite API within an iPhone App: (course site)

Download the Zip file (09_MySQLiteTableView.zip)

C functions need to be declared outside of the @implementation in an Objective-C (.m) file.

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

Because the C function is outside of the @implementation it cannot call methods like

[self doSomething] 

and has no access to ivars.

This can be worked around as long as the call-back function takes a userInfo or context type parameter, normally of type void*. This can be used to send any Objective-C object to the C function.

As in the sample code, this can be manipulated with normal Objective-C operations.

In addition please read this answer: Mixing C functions in an Objective-C class

like image 179
Richard Stelling Avatar answered Oct 02 '22 00:10

Richard Stelling


To call Objective-C code from a C callback I would use something like:

void * refToSelf; int cCallback() {     [refToSelf someMethod:someArg]; }  @implementation SomeClass - (id) init {      self = [super init];      refToSelf = self; } - (void) someMethod:(int) someArg { } 
like image 21
diciu Avatar answered Oct 02 '22 00:10

diciu