从substringWithRange泄漏内存

时间:2011-08-25 13:52:01

标签: iphone objective-c ios

乐器告诉我,我正在从以下代码片段中泄漏内存

for (int x=0; x<20; x++)
{

LeagueTableRow *aLTR = [[LeagueTableRow alloc] init];   //leaks a certain percentage here

match = [substring rangeOfString: @"text team large-link"];

if (match.location == NSNotFound) 
{
}
if  ((match.location + match.length) > ([substring length]))
{
}

substring = [substring substringFromIndex:(match.location + match.length)];

match2 = [substring rangeOfString: @"title="];
substring = [substring substringFromIndex:(match2.location + match2.length+1)];

match2 = [substring rangeOfString: @">"];

aLTR.teamName = [substring substringToIndex:match2.location-1]; //leaks a percentage here

match2 = [substring rangeOfString: @"number total mp"];
substring = [substring substringFromIndex:(match2.location + match2.length+1)];

match = [substring rangeOfString: @">"];
match2 = [substring rangeOfString: @"<"];



aLTR.played = [substring substringWithRange:NSMakeRange(match.location+1, (match2.location-(match.location+1)))]; //leaks a percentage here

[self.theLeagueTableArray addObject:aLTR];
[aLTR release];

}

仪器通知我泄漏,我在评论代码的地方说有漏洞,说这条线是造成一定比例泄漏的原因。

LeagueTableRow类是一个非常简单的容器类,其中的每个变量都在该类的dealloc中发布。

这可能是什么问题?

我在循环开始时分配aLTR,然后在循环结束时释放aLTR。 NSString方法都是在返回的字符串AFAIK上自动释放所以代码似乎很紧。

任何人都可以对这种令人困惑的情况有所了解吗?构建和分析工具也没有提到任何问题。

非常感谢, -code

3 个答案:

答案 0 :(得分:0)

仪器无法显示实际发生泄漏的位置,仅显示泄漏内存的分配位置。

在您的情况下,第二次泄漏,即财产的分配完成,很可能只是原始泄漏的结果。

原始泄漏是您第一次评论时标记的LeagueTableRow个实例。

这个特殊代码看起来不错,我会去检查theLeagueTableArray属性如何处理它的内存。它是否应该释放内存,实现它的类是否应该释放此属性的后备存储?

答案 1 :(得分:0)

根据我的经验,泄漏的原因通常不是alloc调用。你会发现你将这个LeagueTableRow传递给其他东西并且你忘了发布它。

查看你的代码到处都保留了LeagueTableRow的一个实例,它没有在某个地方发布

答案 2 :(得分:0)

[self.theLeagueTableArray addObject:aLTR];

如果永远不会释放此theLeagueTableArray的支持instnce变量,则其中的任何联盟表行都不会被释放。检查这个类的dealloc方法,并确保在那里释放变量。