乐器告诉我,我正在从以下代码片段中泄漏内存
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
答案 0 :(得分:0)
仪器无法显示实际发生泄漏的位置,仅显示泄漏内存的分配位置。
在您的情况下,第二次泄漏,即财产的分配完成,很可能只是原始泄漏的结果。
原始泄漏是您第一次评论时标记的LeagueTableRow
个实例。
这个特殊代码看起来不错,我会去检查theLeagueTableArray
属性如何处理它的内存。它是否应该释放内存,实现它的类是否应该释放此属性的后备存储?
答案 1 :(得分:0)
根据我的经验,泄漏的原因通常不是alloc调用。你会发现你将这个LeagueTableRow传递给其他东西并且你忘了发布它。
查看你的代码到处都保留了LeagueTableRow的一个实例,它没有在某个地方发布
答案 2 :(得分:0)
[self.theLeagueTableArray addObject:aLTR];
如果永远不会释放此theLeagueTableArray
的支持instnce变量,则其中的任何联盟表行都不会被释放。检查这个类的dealloc方法,并确保在那里释放变量。