Objective C - 访问BOOL对自身的void指针的ivar

时间:2009-10-01 00:26:32

标签: iphone objective-c self instance-variables boolean

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

if(((MidnightViewController *)myself)->alarmPlaying) {

答案 1 :(得分:1)

我认为正确的方法是创建一个属性(抱歉),因为封装是面向对象的方式。为了避免错误并执行您要执行的操作,您需要在界面中使用@public公开ivar。默认情况下,所有ivars都受到保护。