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.
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
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) –