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);
- Can/How do I call an Objective-C method in place of this?
- Can/Should I mix C functions with my Objective-C calls?
- How do I mix C functions with Objective-C methods?
You cannot.
Yes. Write a C function and use that as the callback to the CF function.
You can set
self
as theinfo
pointer in your context structure. That will be passed to the callback. Then, in the callback, cast theinfo
pointer back toid
:You can then send
self
messages. You still can't directly access instance variables, though, since a C function is outside of the@implementation
section. You'll have to make them properties. You can do this with a class extension. (Contrary to what that document says, you would not declare the extension inside@implementation
, but in the same file with it, generally right above it.)To call Objective-C code from a C callback I would use something like:
What I've always found helpful in this situation is to make an Obj-C wrapper on top of the C API. Implement what you need to using C functions, and build an Objective-C class (or two) on top of it, so that's all the outside world will see. For example, in the case of a callback like this, you might make a C function that calls Obj-C delegate methods on other objects.
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)
C functions need to be declared outside of the
@implementation
in an Objective-C (.m) file.Because the C function is outside of the
@implementation
it cannot call methods likeand has no access to ivars.
This can be worked around as long as the call-back function takes a
userInfo
orcontext
type parameter, normally of typevoid*
. 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