我有一个使用 SystemSoundID 播放声音的东西,然后重复使用 C 函数作为声音完成回调,并传递该函数(void *)self
(因为它必须是一个 void 指针),然后我想播放如果 self 的 alarmPlaying BOOL ivar 为 true,则再次发出声音,否则删除声音完成并处理 SSID(提供实例方法将 alarmPlaying 设置为 NO)。self
以 void 指针的形式获取它的 alarmPlaying ivar的正确方法是什么?如果我不需要,使用属性是没有意义的。我不断收到错误Request for member 'alarmPlaying' in something not a structure or union
,以及取消引用 void 指针警告。这是我的功能:
static void alarmSoundDidComplete(SystemSoundID soundID, void *myself) {
// ******* How do I access alarmPlaying from a 'self' casted to a void * ? *******
if((MidnightViewController *)myself->alarmPlaying) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[NSThread sleepForTimeInterval:kAlarmBeepInterval];
AudioServicesPlaySystemSound(soundID);
} else {
AudioServicesRemoveSystemSoundCompletion(soundID);
AudioServicesDisposeSystemSoundID(soundID);
}
}
(它在自己的线程上运行,所以我有一个 kAlarmBeepInterval #define'd)
在实施课程时,我有:
- (void)startPlayingAlarm {
SystemSoundID alarmSoundID = [Utilities createSystemSoundIDFromFile:@"beep"
ofType:@"caf"];
AudioServicesAddSystemSoundCompletion(alarmSoundID, NULL, NULL,
alarmSoundDidComplete, (void *)self);
alarmPlaying = YES;
AudioServicesPlaySystemSound(alarmSoundID);
}
- (void)stopPlayingAlarmAndDisposeSystemSoundID {
alarmPlaying = NO;
}
谢谢。