Категория Objective-C и новый iVar
Я пытаюсь расширить функциональность SimpleAudioEngine cocos2d с возможностью воспроизводить несколько звуковых эффектов один за другим, как некую цепочку. Я пытался сделать это с расширением. Однако теперь я понял, что мне, вероятно, также нужен iVar, чтобы запомнить имена всех звуковых файлов и один, чтобы запомнить, какой звук воспроизводится в данный момент.
Однако кажется, что я не могу добавить iVars в категорию. Вместо этого я попытался использовать расширение, но кажется, что оно должно быть в исходном файле .m класса, чтобы оно также не работало. Есть ли еще один способ, который позволяет мне сделать это?
Заголовок с категорией
<code>#import <Foundation/Foundation.h> @interface SimpleAudioEngine(SoundChainHelper)<CDLongAudioSourceDelegate> -(void)playSoundChainWithFileNames:(NSString*) filename, ...; @end </code>
И .m-файл с расширением:
<code>#import "SoundChainHelper.h" @interface SimpleAudioEngine() { NSMutableArray* soundsInChain; int currentSound; } @end @implementation SimpleAudioEngine(SoundChainHelper) // read in all filenames and start off playing process -(void)playSoundChainWithFileNames:(NSString*) filename, ... { soundsInChain = [[NSMutableArray alloc] initWithCapacity:5]; va_list params; va_start(params,filename); while (filename) { [soundsInChain addObject:filename]; filename = va_arg(params, NSString*); } va_end(params); currentSound = 0; [self cdAudioSourceDidFinishPlaying:nil]; } // play first file, this will also always automatically be called as soon as the previous sound has finished playing -(void)cdAudioSourceDidFinishPlaying:(CDLongAudioSource *)audioSource { if ([soundsInChain count] > currentSound) { CDLongAudioSource* mySound = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right]; [mySound load:[soundsInChain objectAtIndex:0]]; mySound.delegate = self; [mySound play]; currentSound++; } } @end </code>
В качестве альтернативы я попытался определить iVars как свойства, которые будут компилироваться. Однако я не могу ни синтезировать их, ни у меня нет никакой другой возможности связать их с каким-либо методом.
Я пытаюсь реализовать эту функциональность как категорию SimpleAudioEngine, чтобы мне нужно было помнить только один класс, который занимается всеми моими проблемами со звуком. и чтобы я мог создать цепочку так же просто, как это:
<code>[[SimpleAudioEngine sharedEngine] playSoundChainWithFileNames:@"6a_loose1D.mp3", @"6a_loose2D.mp3", @"6a_loose3D.mp3", @"6a_loose4D.mp3", @"6b_won1D.mp3", nil]; </code>
Если есть другой способ, который дает такой же / похожий результат, я также был бы очень благодарен.