AvAudioPlayer установка делегата на ноль освобождает объект делегата? - PullRequest
0 голосов
/ 09 октября 2009
@implementation MyClass

-(id) init
{
    NSString *path0 = [ [NSBundle mainBundle] pathForResource:@"myfile" ofType:@"m4a" ];
    mSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path0] error:NULL]; 
    mSound.delegate = self;  
}

-(void) release 
{

    mSound.delegate = nil;  //<- this line causes MyClass release function to be called recursively
   [ mSound release ];      //<- removing the line above makes this line do the same, i.e. calls myclass release recursively  
}

Похоже, что при выпуске AvAudioPlayer также освобождается объект делегата, я пытался вызвать retain on self вручную при назначении его делегату, но это не помогло.

даже если я сделаю что-то вроде:

-(id) init
{
    NSString *path0 = [ [NSBundle mainBundle] pathForResource:@"myfile" ofType:@"m4a" ];
    mSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:path0] error:NULL]; 
    mSound.delegate = self; 
    mSound.delegate = nil;  //<- (just for test), causes MyClass release to be invoked,    
}

Я получаю выпуск Myclass, который будет вызываться сразу после инициализации, когда я назначаю делегата nil

Есть идеи, что происходит?

1 Ответ

0 голосов
/ 09 октября 2009

Обычно делегаты не сохраняют, а только назначают. Делегат должен быть оставлен в другом месте. Среди прочего, это предотвращает возникновение циклов.

...