Это действительно распространенная проблема. self
здесь не работает, потому что это не метод класса AudioRecorder
, а не потому, что это код Objective-C. Вы находитесь в файле Objective-C ++, поэтому все действующие коды Objective-C будут работать. [anAudioRecorder playAlarmSound]
будет работать нормально, если у вас есть хорошая ссылка на anAudioRecorder
.
Так как же получить справку, если у нас нет доступа к self
? Обычный способ - использовать аргумент void* aqData
этой функции в качестве указателя на ваш AudioRecorder
объект. Когда вы зарегистрировали этот обратный вызов, вы сказали ему, каким будет аргумент void*
, в данном случае указатель на ваш объект или структуру AQRecorderState
, которые вы, похоже, не используете. Вместо этого вы можете использовать указатель на self
при регистрации, чтобы вы могли использовать этот объект здесь.
Другой вариант - использовать общий объект AudioRecorder
, и в этом случае вы должны вызвать что-то вроде [AudioRecorder sharedInstance]
(класс, а не экземпляр, метод), чтобы получить нужный объект AudioRecorder
. Поскольку другой ответ здесь раскрывает первый метод, здесь показано, как использовать параметр общего экземпляра: добавьте статический экземпляр AudioRecorder
и метод класса sharedInstance
к вашему AudioRecorder
объекту, например так:
static AudioRecorder* sharedMyInstance = nil;
+ (id) sharedInstance {
@synchronized(self) {
if( sharedMyInstance == nil )
sharedMyInstance = [[super allocWithZone:NULL] init];
}
return sharedMyInstance;
} // end sharedInstance()
Затем, когда вы захотите использовать AudioRecorder
в вашем обратном вызове, вы можете получить общий экземпляр, используя [AudioRecorder sharedInstance]
. Это очень полезная парадигма, если будет только один AudioRecorder
- она исключает много ссылок.