0

我有一个使用 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;
}

谢谢。

4

2 回答 2

1

->比演员有更高的优先级;你需要这样做:

if(((MidnightViewController *)myself)->alarmPlaying) {
于 2009-10-01T00:31:36.817 回答
1

我相信正确的方法是创建一个属性(对不起),因为封装是面向对象的方式。为了不得到错误并做你想做的事情,你需要@public在界面中使用公开的 ivar。默认情况下,所有 ivars 都受到保护。

于 2009-10-01T00:32:23.100 回答