Как мне дать функции C указатель на 'self' (вызывая obj) в target-c? - PullRequest
8 голосов
/ 27 апреля 2011

Привет всем!Я довольно плохо знаком с целью-c, поэтому мне еще никогда не приходилось решать эту проблему.У меня есть функция C в моем классе target-c, и я хочу иметь возможность вызывать метод для свойства содержащего класса target-c.

Я понимаю, что моя функция C не поймет, что такое self'если я попытаюсь просто отправить сообщение [self.delegate doSomething]

Я предполагаю, что мне нужно сделать, чтобы дать моей функции c указатель на мой класс, чтобы я мог сделать что-то вроде этого:

myClass-> делегат -> doSomething ();

Я хотел бы сохранить указатель на текущий объект (себя) в глобальной переменной, потому что я не могу изменить сигнатуры функций.Я хочу иметь возможность получить доступ к указателю из любой функции C, определенной в этом классе.Причина этого в том, что я пишу обертку вокруг библиотеки C, которую пытаюсь использовать.Если это поможет ... Я бы предпочел не изменять исходный код этой библиотеки.

Может кто-нибудь помочь мне с тем, как получить указатель на текущий объект?Спасибо!

 void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
{
    //[self.delegate privateMessage]; I would like to do the following
}

Ответы [ 2 ]

17 голосов
/ 27 апреля 2011

self - указатель на объект текущего метода, находящийся внутри метода. Таким образом, вы можете присвоить это глобальной переменной, типизированной как ваш класс:

// Global scope
static MyClass *globalSelf;

// C function
void foo() {
    [globalSelf->delegate doSomething];
}

// ObjC method
- (void)setMyselfUpAsTheGlobalVariable {
    globalSelf = self;
    foo();
}

Хотя это должно сработать, я должен отметить, что это довольно уродливо, и вы должны быть осторожны, чтобы глобальная переменная не попала в параллельный код. Большинство API в стиле C позволяют передавать переменную void* в качестве пользовательского параметра. Если это верно для API, который вы упаковываете, это было бы идеальным местом для хранения экземпляра объекта Objective-C, а не глобальной переменной.

0 голосов
/ 27 апреля 2011

Объявите это как показано ниже

MyObjectiveCClass self;

Используйте переменную self extern для вызова функции obj-C

 void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
{
    [self.delegate privateMessage]; //I would like to do the following
}

Также проверьте сообщение SO,

Невозможно вызвать метод Objective C из функции C

...