2012-04-30 1 views
2

У меня есть функция C (функция обратного вызова в службах очереди аудио), и я хочу отправить сообщение самому. Как это сделать? Если я печатаю в [самом сообщении], есть ошибка:Как отправить сообщение self в функции C в obj-C?

Use of undeclared identifier 'self' 
+0

предоставить более подробную информацию, самовывозом вы имеете в виду ваш класс не так ли? вы не можете просто [само сообщение]? так как даже если его функцию c вы можете добавить объективный код c. или самим собой, вы имеете в виду вашу функцию, как в рекурсии? – Pochi

+0

Возможный дубликат [Вызов функции Objective C из кода C++] (http://stackoverflow.com/questions/6958685/calling-a-objective-c-function-from-c-code) – Caleb

ответ

4

Вы не выполняете objc-сообщения в обратных вызовах реального времени, таких как аудио. Причина этого в том, что обмен сообщениями objc не является постоянным временем и может блокироваться, что приводит к пропущенным крайним срокам, что приводит к отключению звука. Статические или динамические (virtual) вызовы C++ и вызовы функций C, конечно, постоянное время и подходят для контекстов реального времени.

Если бы не были в режиме реального времени/аудио обратного вызова, то один из вариантов было бы передать self как пользователь информации или контекста параметра:

void SomeCallback(t_stuff* const stuff, void* userInfo) { 
    MONClass * Self = (MONClass*)userInfo; 
    [Self doSomething]; 
} 
+0

Фактически я Я пишу функцию HandleInputBuffer, где, похоже, нет способа добавить такой параметр. Есть ли другой способ? – yoyosir

+0

@ user1214321 Для примера воспользуйтесь ссылкой на дублированный вопрос. – Caleb

+0

@ user1214321 'HandleInputBuffer' - это, по-видимому, название некоторой функции из некоторого кода примера Java или demo/docs - функция' HandleInputBuffer' используется как 'AudioQueueInputCallback'. В качестве «AudioQueueInputCallback» первым параметром 'void * inUserData' будет параметр, о котором я говорю. – justin

3

self имеет смысл только в контексте определения класса - это указатель на экземпляр этого класса. Функции не являются частью какого-либо класса, поэтому нет указателя self. Если вы хотите, чтобы ваш обратный вызов мог отправлять сообщение на заданный объект, вам нужно зачеркнуть указатель на этот объект, где ваш обратный вызов может найти его. Это может быть глобальная переменная (ick), параметр userInfo, предназначенный для такого рода вещей (намного лучше) или где-то еще.

+1

+1 для объяснения причины почему вы * не можете * использовать 'self' в функции C (в принятом ответе только говорится, почему вы не должны использовать сообщение Objective-C, передаваемое в звуковых обратных вызовах, а не почему вы не можете ссылаться на' self') – JeremyP