Цель C Переназначение / Сбой управления памятью - PullRequest
0 голосов
/ 12 марта 2011

Как относительный новичок в Objective-C, я, очевидно, все еще не понимаю некоторые правила управления памятью.Я не могу понять, как сделать так, чтобы это не вылетало:

@interface MyClass { NSArray *playerArray4th; }

- (void) viewDidLoad { playerArray4th = [self getAudioPlayersForSoundFile:@"rimshot" ofType:@"aif"]; }

- (NSArray*) getAudioPlayersForSoundFile:(NSString*)soundFileName ofType:(NSString*)soundFileType {

    //code instantiating objects....

    NSArray *toRet = [[NSArray alloc] initWithObjects:toRetTickPlayer,toRetTickPlayerCopy,toRetTickPlayerCopy2,toRetTickPlayerCopy3, nil];
    return toRet;
}

Затем, позже, в другой функции:

NSArray *currentArray = playerArray4th;
[currentArray release];
currentArray = nil;
currentArray = [self getAudioPlayersForSoundFile:fileName ofType:ofType];

И происходит сбой при попытке доступа к массиву снова:

- (void) playSound:(NSString*)soundType {

    AVAudioPlayer *currentPlayer;

    if ([soundType isEqualToString:@"4th"]) {
        if (playerArray4thCounter >= [playerArray4th count]) playerArray4thCounter = 0;
        NSLog(@"Playing from array: %@",playerArray4th);
        currentPlayer = [playerArray4th objectAtIndex:playerArray4thCounter];
        playerArray4thCounter++;
    }
}

1 Ответ

0 голосов
/ 12 марта 2011

Попробуйте узнать о properties и об использовании геттеров и сеттеров. Не используйте ярлыки, если точно не знаете, что происходит.

Итак, определите свойство playerArray4th в заголовочном файле:

@property (nonatomic,retain) NSArray *playerArray4th;

А затем в вашем .m файле создайте getter / setter:

@synthesize playerArray4th;

Тогда всегда используйте self.playerArray4th для присвоения и получения переменной. Предыдущие объекты будут освобождены при необходимости.

Так что это не будет течь:

self.playerArray4th = [NSArray arrayWithObjects:@"text",@"text",nil];
self.playerArray4th = [NSArray arrayWithObjects:@"new array",@"text",nil];

потому что второе назначение освобождает первый массив.

Кроме того, прочитайте об использовании autorelease. Короче говоря, если вы alloc, copy или new, вам следует либо release, либо autorelease. Здесь можно многое прочитать об этом, поэтому я не буду повторяться здесь и сейчас.

Не забудьте указать self.playerArray4th = nil; в вашем методе dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...