我有一个在c中执行的函数。当满足某个条件时,我想改变UIButton的状态。我试图发送一个NSNotification,但这不起作用。
从c函数向obj-c对象发送消息的好方法是什么?
理想情况下,我想以某种方式使用NSNotification
答案 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}函数无法使用self
和super
,除非您自己定义它们。
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(...)它都运行良好。