0

SystemSoundID を使用してサウンドを再生し、C 関数をサウンド完了コールバックとして使用して繰り返し、関数が渡され(void *)self(void ポインターである必要があるため)、再生したい自分自身の alarmPlaying BOOL ivar が true の場合はサウンドを再度再生します。それ以外の場合はサウンドの補完を削除し、SSID を破棄します (alarmPlaying を NO に設定するインスタンス メソッドを提供します)。selfvoid ポインターの形式を取り、その alarmPlaying ivar を取得する適切な方法は何ですか? 必要がなければ、プロパティを使用しても意味がありません。エラーが発生し続け、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 しました)

そして、私が持っているクラスの実装では:

- (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

カプセル化はオブジェクト指向の方法であるため、適切な方法はプロパティを作成することだと思います(申し訳ありません)。エラーが発生しないようにするには、インターフェイスで使用して ivar を公開する必要があり@publicます。デフォルトでは、すべての ivar が保護されています。

于 2009-10-01T00:32:23.100 に答える