Iphone 处理NSMutableArray时Objective-C中的内存管理

Iphone 处理NSMutableArray时Objective-C中的内存管理,iphone,Iphone,在仪器中,tempPlayer对象显示泄漏。在这段代码中,在每个for循环中,我一直在分配一个新的templayer实例,用字符串设置其playerCode变量,并在每次迭代中将其添加到NSMutableArray中。仪器显示alloc语句有漏洞。有没有办法防止tempPlayer对象中的tat泄漏 for(int i = 0 ; i < [homeLineupArray count] ; i++) { NSArray * tildeSeperator = [[homeLi

在仪器中,tempPlayer对象显示泄漏。在这段代码中,在每个for循环中,我一直在分配一个新的templayer实例,用字符串设置其playerCode变量,并在每次迭代中将其添加到NSMutableArray中。仪器显示alloc语句有漏洞。有没有办法防止tempPlayer对象中的tat泄漏

 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 ];
}
谢谢
Harikant Jammi

< P>事情可能取决于如何声明类中的TunPope属性,并且当它看起来是临时对象时,考虑它是否需要属性访问器? 所以你可以看到,你保留你的物体的次数比你释放它的次数多,所以它最终会泄漏。您的代码可能会这样重写:

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
    }

首先,您可以将释放更改为自动释放,并在分配self后将其移动到行中


第二,addobject正在将它添加到保留它的集合中,我没有看到您将它从该集合中删除,因此这是您的“泄漏”。但是,如果您打算将其保留在集合中,我甚至不确定是否存在泄漏。

不要使用属性templayer,而是使用局部变量,并在添加到数组后释放:

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];
}

数组保留您添加的对象-这就是为什么您也需要释放临时对象。

我只需要这样做

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(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] ;

看起来我们在同一时间得出了相同的结论;-可能templayer也应该成为一个局部变量。是的,忘记添加templayer声明了。这只是一次泄漏,但是,它不会每次泄漏更多。我已经更新了我的答案来解决这个问题。更改为自动释放只会在发布发生时延迟。它不会影响泄漏,但这只是一次泄漏-这取决于属性的实现方式-我们看不到。此外,OP并没有说它在每次迭代中都会泄漏——只是仪器在alloc中显示泄漏@未知-因此它将在最后一次迭代后继续保持其引用,但其他迭代应该很好。自动释放应该修复泄漏-但我认为最好在添加到数组后显式释放,尽管在实践中它不太可能在这种情况下产生大的差异-这更像是一种风格的问题不需要localString=[NSMutableString];正如Vladimir所说,您不需要localString=[NSMutableString];-这会导致泄漏。不过,您需要声明localString。你在用playerNameArray做什么?难道[NSMutableString]不会返回自动释放的对象吗?是的,对不起,划伤它-那里没有泄漏-但它是多余的。Instruments工具有时会给出误报吗?因为在所有方法中我都使用了局部变量,它只能在这个函数中显示泄漏。有什么线索吗?哈里坎特·贾米
for (NSString *lineup in homeLineupArray) {
    NSArray *tildeSeparator = [lineup componentsSeparatedByString:@"~"];
    ...
}
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] ;