Вызовите объект obj-c из функции ac - PullRequest
3 голосов
/ 24 июня 2011

У меня есть функция, которая выполняется в c.Когда определенное условие выполнено, я хочу изменить состояние UIButton.Я пытался отправить NSNotification, но это не работает.

Что было бы хорошим способом отправить сообщение объекту obj-c из функции ac?

В идеале я хотел бы как-нибудьуметь использовать NSNotification

Ответы [ 4 ]

5 голосов
/ 24 июня 2011

Код C должен находиться внутри файла .m. Если это не так, добавьте функцию обратного вызова C внутри вашего .m, которая может опубликовать ваше уведомление или сделать что-то еще для вас. Вот пример доступа к классу Objective-C, который вызывает функцию C вне файла .m.

//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
2 голосов
/ 24 июня 2011

Просто скомпилируйте ваши файлы C как Objectice-C;и обращайтесь к NSNotificationCenter как обычно.

В отличие от C ++, Objective-C не создает никаких ошибок совместимости с кодом C.Весь и любой код на C также является допустимым кодом Objective-C, предполагая, что используемый базовый стандарт одинаков.

Редактировать: Чтобы уточнить: пока вы используете компилятор Objective-C;нет разницы между тем, что вы можете сделать в методе и функции;за исключением того, что self и super недоступны для использования в функциях C, если вы сами не определите их.

Reedit: Для определения себя в функции C;просто определите его следующим образом:

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

и передайте любой соответствующий self при вызове функции.

1 голос
/ 10 июня 2014

Я потратил довольно много времени, чтобы найти решение для отправки уведомлений от C до Objective C для моего приложения для OS X, разработанного с XCode 5 на Mavericks. Ответ Джо был единственным рабочим решением для меня с XCode 5 на Mavericks.Я должен был добавить мост, хотя.Итак, мое приложение имеет код, подобный следующему:

//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
0 голосов
/ 17 января 2013

Я много возился с этим, поэтому
просто дополнительно:
Я использую модуль c, который я не хочу переименовывать в * .m файлы. И мне нужен журнал оттуда.
Никакие обертки не могут помочь мне избежать ошибок компоновщика.
Поэтому я использовал следующий шаблон:
Я сделал hpp и cpp файлы Добавлена ​​переменная extern - указатель на функцию для заголовка:

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

и его определение в файл cpp

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

Затем я создал файл h и mm: ч:

#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 (...), он работал нормально.

...