2009-10-01 13 views
0

J'ai quelque chose qui utilise un SystemSoundID pour jouer un son, puis je répète avec une fonction C utilisée comme rappel de fin de son, et la fonction est passée (void *)self (depuis il doit être un pointeur vide), puis je veux jouer à nouveau le son si le BOAR ivar de self est vrai, sinon supprimer le son et disposer le SSID (fournissant une méthode d'instance pour mettre alarmPlaying sur NO). Qu'est-ce que la bonne façon de prendre self sous la forme d'un pointeur vide et obtenir son ivar AlarmPlaying? Il ne sert à rien d'utiliser une propriété si je n'en ai pas besoin. Je continue d'obtenir l'erreur Request for member 'alarmPlaying' in something not a structure or union et un avertissement de pointeur de déréférencement. Voici la fonction que j'ai:Objectif C - accéder BOOL ivar du pointeur vide à soi

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); 
    } 
} 

(Son fonctionnement sur son propre fil, donc j'ai kAlarmBeepInterval # define'd)

et dans la mise en œuvre de la classe je:

- (void)startPlayingAlarm { 
    SystemSoundID alarmSoundID = [Utilities createSystemSoundIDFromFile:@"beep" 
                   ofType:@"caf"]; 
    AudioServicesAddSystemSoundCompletion(alarmSoundID, NULL, NULL, 
              alarmSoundDidComplete, (void *)self); 
    alarmPlaying = YES; 
    AudioServicesPlaySystemSound(alarmSoundID); 
} 

- (void)stopPlayingAlarmAndDisposeSystemSoundID { 
    alarmPlaying = NO; 
} 

Merci.

Répondre

1

-> a une priorité plus élevée que la distribution; vous devez faire ceci:

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

Vous aviez raison! Malheureusement, je me suis rendu compte que l'autre réponse est bonne aussi, maintenant je reçois un avertissement disant que c'est @protected et que je vais avoir une grosse erreur dans le futur. Dois-je simplement utiliser un accesseur ou le rendre @public? Cela sera appelé à peu près toutes les demi-secondes. – mk12

+0

Vous pouvez simplement ajuster votre code pour envoyer un pointeur vers le drapeau BOOL au lieu de votre pointeur auto. Pas tout à fait OO, mais encore une fois, il n'y a pas de fonction C statique dans Obj-C, et vous avez l'avantage de vous débarrasser des problèmes d'encapsulation et de ne pas vous inquiéter des frais généraux. AudioServicesAddSystemSoundCompletion (alarmSoundID, NULL, NULL, alarmSoundDidComplete, et self-> alarmPlaying) –

1

je crois que la bonne façon serait de créer une propriété (désolé), parce que l'encapsulation est la manière orientée objet. Pour ne pas obtenir l'erreur et faire ce que vous essayez de faire, vous devez rendre le public ivar en utilisant @public dans l'interface. Par défaut, tous les ivars sont protégés.