Categoria Objective-C e novo iVar

Eu tento estender a funcionalidade do SimpleAudioEngine do cocos2d com a capacidade de reproduzir vários efeitos sonoros um após o outro como um tipo de cadeia. Eu tentei fazer isso com uma extensão. No entanto, agora percebi que provavelmente também preciso de um iVar para lembrar os nomes de todos os arquivos de som e um para lembrar qual som está sendo reproduzido no momento.

No entanto, parece que não posso adicionar iVars em uma categoria. Em vez disso, tentei usar uma extensão, mas parece que eles precisam estar no arquivo .m original da classe, de modo que também não funcionaria. Existe ainda outra maneira, que me permite fazer isso?

O cabeçalho com a categoria

<code>#import <Foundation/Foundation.h>
@interface SimpleAudioEngine(SoundChainHelper)<CDLongAudioSourceDelegate>
-(void)playSoundChainWithFileNames:(NSString*) filename, ...;
@end
</code>

E o arquivo .m com a extensão:

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

Alternativamente, tentei definir o iVars como propriedades, que serão compiladas. No entanto, não posso sintetizá-los nem tenho outra possibilidade de ligá-los a qualquer método.

Eu tento implementar a funcionalidade como uma categoria de SimpleAudioEngine para que eu só precise lembrar de uma classe que lida com todos os meus problemas de som. e para que eu possa criar uma cadeia tão simples como esta:

<code>[[SimpleAudioEngine sharedEngine] playSoundChainWithFileNames:@"6a_loose1D.mp3", @"6a_loose2D.mp3", @"6a_loose3D.mp3", @"6a_loose4D.mp3", @"6b_won1D.mp3", nil];
</code>

Se houver outra maneira que produza o mesmo resultado, eu também ficaria muito agradecido.

questionAnswers(2)

yourAnswerToTheQuestion