我有一个使用SystemSoundID播放声音的东西,然后重复使用C函数作为声音完成回调,函数传递(void *)self
(因为它必须是一个无效指针),然后我想再次播放声音,如果alarmPlaying BOOL自定义为真,否则删除声音完成并处理SSID(提供实例方法将alarmPlaying设置为NO)。以虚拟指针的形式获取self
并获得警报的正确方法是什么?如果我不需要,使用房产是没有意义的。我一直收到错误Request for member 'alarmPlaying' in something not a structure or union
和一个解除引用的无效指针警告。这是我的功能:
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;
}
感谢。
答案 0 :(得分:1)
->
的优先级高于演员;你需要这样做:
if(((MidnightViewController *)myself)->alarmPlaying) {
答案 1 :(得分:1)
我认为正确的方法是创建一个属性(抱歉),因为封装是面向对象的方式。为了避免错误并执行您要执行的操作,您需要在界面中使用@public
公开ivar。默认情况下,所有ivars都受到保护。