从c函数调用obj-c对象

时间:2011-06-24 12:46:56

标签: iphone objective-c c

我有一个在c中执行的函数。当满足某个条件时,我想改变UIButton的状态。我试图发送一个NSNotification,但这不起作用。

从c函数向obj-c对象发送消息的好方法是什么?

理想情况下,我想以某种方式使用NSNotification

4 个答案:

答案 0 :(得分:5)

C代码需要在.m文件中。如果不是,那么在你的.m中添加一个C回调函数,可以发布你的通知或为你做其他事情。以下是访问在.m文件之外调用C函数的Objective-C类的示例。

//SomeCCode.c
void someCFunction(int somevar, void (callback) (void*) , void *context)
{
    doSomething(somevar);
    callback(context);
}

//SomeClass.m
void someCCallbackInObjC(void *context)
{
    SomeClass *myclass = (SomeClass*)context;
    //Access my class or just post notification
}

@implementation SomeClass

...
-(void)someMethod
{
    someCFunction(0, someCCallbackInObjC, self);
}
...

@end

答案 1 :(得分:2)

只需将您的C文件编译为Objectice-C;和往常一样访问NSNotificationCenter。

与C ++不同,Objective-C不会在C代码上产生兼容性缺陷。所有和任何C代码也是有效的Objective-C代码,假设使用的基础标准是相同的。

编辑:详细说明:只要您使用Objective-C编译器;你在方法和函数中可以做的事情没有区别;除了{C}函数无​​法使用selfsuper,除非您自己定义它们。

Reedit:为了在C函数中定义self;只需按如下方式定义:

notifyingFunction(id self, /* other arguments */);

并在调用函数时传递任何适当的self

答案 2 :(得分:1)

我已经花了很长时间才找到解决方案,为我在Mavericks上使用XCode 5开发的OS X应用程序发布从C到Objective C的通知。 {3}是我在Mavericks上使用XCode 5的唯一可行解决方案。我不得不添加桥接。所以,我的应用程序的代码类似于以下内容:

//SomeCCode.c - no changes here
void someCFunction(int somevar, void (callback) (void*) , void *context)
{
    doSomething(somevar);
    callback(context);
}

//SomeClass.m
void someCCallbackInObjC(void *context)
{
    // change #1: added __bridge in type cast
    SomeClass *myclass = (__bridge SomeClass*)context;
    //Access my class or just post notification
}

@implementation SomeClass

...
-(void)someMethod
{
    // change #2: added the type cast with __bridge for self
    someCFunction(0, someCCallbackInObjC, (__bridge void*) (self));
}
...

@end

答案 3 :(得分:0)

我这么做很多 另外:
我正在使用一个c单元,我不想重命名为* .m文件。我需要一个从那里调用的日志 没有包装器可以帮助我避免链接器错误 所以我使用了以下模式:
我制作了hpp和cpp文件 添加了一个extern变量 - 指向标题函数的指针:

extern void (*transLogFun) (const char *,...);

及其对cpp文件的定义

void (*transLogFun) (const char *,...) = NULL;

然后我创建了一个h和mm文件: H:

#import <UIKit/UIKit.h>
#import "fff.hpp"

void ioslogfun(const char *s, ...);

在mm文件中,我编写了一个函数和一个类,其对象如下:

#import "zzz.h"
#import <Foundation/Foundation.h>

void ioslogfun(const char *s, ...){
    va_list vl;
    va_start(vl,s);
    char *str;
    vasprintf(&str,s,vl);
    va_end(vl);
    NSLog([NSString stringWithUTF8String:str]);
    free(str);
}

class Fff{
public:
    Fff(){
        transLogFun = &ioslogfun;
    }
};

Fff initiator;

无论我在哪里调用transLogFun(...)它都运行良好。