Управление памятью в Objective-C при работе с NSMutableArray - PullRequest
0 голосов
/ 21 января 2010

В инструментах объект tempPlayer показывает утечку. В этом коде в каждом цикле for я продолжаю выделять новый экземпляр tempPlayer, устанавливаем переменную playerCode со строкой и добавляем ее в NSMutableArray в каждой итерации. Instruments показывает мне утечку в операторе alloc. Есть ли способ предотвратить утечку тата в объекте tempPlayer?

 for(int i = 0 ; i < [homeLineupArray count] ; i++) {   
    NSArray * tildeSeperator = [[homeLineupArray objectAtIndex:i] componentsSeparatedByString:@"~"];

    [self.tempPlayer release];
    self.tempPlayer = [[LineUpsPlayer alloc] init];
    tempPlayer.playerCode = [tildeSeperator objectAtIndex:0];

    [matchLineUp.homeTeamPlayingEleven addObject:tempPlayer ];
}

Спасибо Харикант Джамми

Ответы [ 5 ]

1 голос
/ 21 января 2010

Я бы просто сделал это.

for(int i = 0 ; i < [homeLineupArray count] ; i++) {   
    NSArray *tildeSeperator = [[homeLineupArray objectAtIndex:i] componentsSeparatedByString:@"~"];

    LineUpsPLayer *player = [[[LineUpsPlayer alloc] init] autorelease];
    player.playerCode = [tildeSeperator objectAtIndex:0];
    [matchLineUp.homeTeamPlayingEleven addObject:player];
}

Вы также можете заменить свой цикл следующим образом:

for (NSString *lineup in homeLineupArray) {
    NSArray *tildeSeparator = [lineup componentsSeparatedByString:@"~"];
    ...
}

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

0 голосов
/ 21 января 2010

Как сказано выше, я обычно использую локальную переменную для заполнения изменяемого массива. В других случаях приборы не показывали мне утечки. Так это правильный путь?

for(int i =0 ; i <  ([arrayOfHomePlayers count]); i++ ) //creating home players detials object
{

    localString = [NSMutableString string];
    localString = [arrayOfHomePlayers objectAtIndex:i] ;
    NSArray * localPlayersArray = [localString componentsSeparatedByString:@"~"] ;
    localPlayerPosition = [ [PlayerPosition  alloc] init] ;

    NSArray * playerNameArray = [[localPlayersArray objectAtIndex:0] componentsSeparatedByString:@" "] ;
    localPlayerPosition.globalID   = [localPlayersArray objectAtIndex:1];

    [(teamFormationDetails.homePlayerList) addObject:localPlayerPosition] ;
    [localPlayerPosition release] ;
0 голосов
/ 21 января 2010

Во-первых, вы можете изменить выпуск на автоматический выпуск и переместить его в строку после присвоения себя.

Во-вторых, addobject добавляет его в коллекцию, которая сохраняет его, и я не вижу, чтобы вы удаляли его из этой коллекции, так что это ваша утечка. Однако я не уверен, что даже есть утечка, если вы намеревались оставить ее в коллекции.

0 голосов
/ 21 января 2010

Вместо использования свойства tempPlayer используйте локальную переменную и выпускайте после добавления в массив:

for(int i = 0 ; i < [homeLineupArray count] ; i++) {   
    NSArray * tildeSeperator = [[homeLineupArray objectAtIndex:i] componentsSeparatedByString:@"~"];

    LineUpsPlayer* tempPlayer = [[LineUpsPlayer alloc] init];
    tempPlayer.playerCode = [tildeSeperator objectAtIndex:0];

    [matchLineUp.homeTeamPlayingEleven addObject:tempPlayer ];
    [tempPlayer release];
}

В массиве сохраняются добавленные вами объекты, поэтому вам также необходимо освободить временный объект.

0 голосов
/ 21 января 2010

Вещи могут зависеть от того, как вы объявляете свое свойство tempPlayer в своем классе (и, поскольку он выглядит как временный объект, подумайте, нужен ли вам для него метод доступа к свойству?)

for(int i = 0 ; i < [homeLineupArray count] ; i++) {   
    NSArray * tildeSeperator = [[homeLineupArray objectAtIndex:i] componentsSeparatedByString:@"~"];

    [self.tempPlayer release]; // Decrease retain count 
    self.tempPlayer = [[LineUpsPlayer alloc] init]; // retain count increase by 1 or 2
    tempPlayer.playerCode = [tildeSeperator objectAtIndex:0];

    [matchLineUp.homeTeamPlayingEleven addObject:tempPlayer]; // retain count increase
}

Итак, как вы видите, вы сохраняете свой объект больше раз, чем отпускаете его, и в итоге он протекает. Возможно, ваш код может быть переписан следующим образом:

for(int i = 0 ; i < [homeLineupArray count] ; i++) {   
        NSArray * tildeSeperator = [[homeLineupArray objectAtIndex:i] componentsSeparatedByString:@"~"];

       LineUpsPlayer* tempPlayer = [[LineUpsPlayer alloc] init]; // object's retain count is 1
        tempPlayer.playerCode = [tildeSeperator objectAtIndex:0];

        [matchLineUp.homeTeamPlayingEleven addObject:tempPlayer]; // container takes ownership of the object
        [tempPlayer release]; // we do not need to own this object as it is in container now
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...