导致内存泄漏的Iphone子字符串
我刚刚结束我的应用程序,所以我进入了运行仪器的阶段,以确定应用程序中的漏洞。我遇到了一个漏洞,我不明白为什么它被登记为漏洞 例如,我有以下几行:导致内存泄漏的Iphone子字符串,iphone,memory-leaks,substring,Iphone,Memory Leaks,Substring,我刚刚结束我的应用程序,所以我进入了运行仪器的阶段,以确定应用程序中的漏洞。我遇到了一个漏洞,我不明白为什么它被登记为漏洞 例如,我有以下几行: NSString *imageType = [[[NSString alloc] initWithString:[loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location]] autorelease]; imageType = [imageType
NSString *imageType = [[[NSString alloc] initWithString:[loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location]] autorelease];
imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length];
NSString*imageType=[[NSString alloc]initWithString:[loopString substringToIndex:[loopString rangeOfString:@”“].location]]autorelease];
imageType=[imageType substringFromIndex:[imageType rangeOfString:@”“]。位置+:@”“。长度];
因此,基本上我所做的就是拉出“loopstring”的一部分并将其放入imagetype字符串中,而不仅仅是使用SubstringFromIndex方法切断字符串的尾部绒毛
当我运行仪器时,它显示“NSCFString substringwithRange”泄漏。它突出显示了第二行:
imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length];
imageType=[imageType substringFromIndex:[imageType rangeOfString:@”“]。位置+:@”“。长度];
我认为substringFromIndex方法应该返回一个自动添加到自动释放池的字符串
你知道我哪里出了问题吗
谢谢
以下是重构后的代码:
- (void)SetupTop10:(NSString *)Top10Data
{
while (Top10Data != @"") {
NSLog(Top10Data);
if ([Top10Data rangeOfString:@"</TOP10ENTRY>"].location == NSNotFound){
Top10Data = @"";
}
else
{
NSString *loopString = [Top10Data substringToIndex:[Top10Data rangeOfString:@"</TOP10ENTRY>"].location + 13];
Top10Data = [Top10Data stringByReplacingOccurrencesOfString:loopString withString:@""];
//NOW CREATE A RECORD FOR THIS ITEM
NSString *imageType = [loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location];
imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + 7];
NSString *displayText = [loopString substringToIndex:[loopString rangeOfString:@"</DISPLAYTEXT>"].location];
displayText = [displayText substringFromIndex:[displayText rangeOfString:@"<DISPLAYTEXT>"].location + 13];
NSString *link = [loopString substringToIndex:[loopString rangeOfString:@"</INTERESTID>"].location];
link = [link substringFromIndex:[link rangeOfString:@"<INTERESTID>"].location + 12];
[Top10Images addObject:imageType];
[Top10Links addObject:link];
[Top10s addObject:displayText];
Top10RowCount = Top10RowCount + 1;
}
}
[self.Top10Table reloadData];
Top10Table.hidden = NO;
loadingLabel.hidden = YES;
loadingIndicator.hidden = YES;
-(无效)设置TOP10:(NSString*)TOP10数据
{
而(Top10Data!=@“”){
NSLog(Top10Data);
if([TOP10数据范围字符串:@”“)。位置==NSNotFound){
Top10Data=@;
}
其他的
{
NSString*loopString=[Top10Data substringToIndex:[Top10Data rangeOfString:@”“]。位置+13];
Top10Data=[Top10Data STRINGBYREPLACINGOCURNCESOFSTRING:loopString withString:@”“];
//现在为该项目创建一个记录
NSString*imageType=[loopString substringToIndex:[loopString rangeOfString:@”“。位置];
imageType=[imageType substringFromIndex:[imageType rangeOfString:@”“。位置+7];
NSString*displayText=[loopString substringToIndex:[loopString rangeOfString:@”“。位置];
displayText=[displayText substringFromIndex:[displayText rangeOfString:@”“]。位置+13];
NSString*link=[loopString substringToIndex:[loopString rangeOfString:@”“。位置];
link=[link substringFromIndex:[link RANGEOFTSTRING:@”“]。位置+12];
[Top10ImagesAddObject:imageType];
[Top10Links addObject:link];
[Top10s addObject:displayText];
Top10RowCount=Top10RowCount+1;
}
}
[self.Top10Table reloadData];
Top10Table.hidden=否;
loadingLabel.hidden=是;
loadingIndicator.hidden=是;
}
//******************它看起来没有漏水。但为什么呢
NSString *imageType = [[[NSString alloc] initWithString:
[loopString substringToIndex:[loopString
rangeOfString:@"</IMAGE>"].location]
] autorelease];
NSString*imageType=[[[NSString alloc]initWithString:
[loopString substringToIndex:[loopString
rangeOfString:@“].位置]
]自动释放];
如果你能有效地得到同样的结果
NSString *imageType = [loopString substringToIndex:[loopString
rangeOfString:@"</IMAGE>"].location];
NSString*imageType=[loopString substringToIndex:[loopString
rangeOfString:@“].location];
内存使用率只有一半时?泄漏将告诉您泄漏内存的分配位置。如果单击(我认为内存地址旁边有一个右箭头图标),那么可以查看该地址的所有分配/保留/释放 在本例中,“泄漏”将指向第一行,当第五行是“泄漏”时(实际上是dealoc/on assignment中丢失的版本泄漏):
tableView:cellForRowAtIndexPath:do有什么作用?我看不出上述代码中有任何问题。您是否在dealloc方法中发布了
Top10Images
很抱歉,这是我的第一个应用程序,所以还有一些黑客代码。但这并不能解释它应该泄漏的原因。第二行应该是:imageType=[imageType substringFromIndex:[imageType rangeOfString:@”“]。location+@。length];你必须认识到,仪器也只是一种工具,它可能会出错。保持代码干净整洁有助于防止它们。尝试将“长度”更改为“7”。你确定这些行附近没有其他黑客代码吗?是的,我刚刚重构了代码,删除了initwithstring,我还将@“.长度更改为7,但问题仍然存在。请用当前代码更新你的问题,这样我们都知道我们在说什么。另外,请告诉我在这些行之后imageType会发生什么情况。因为您可能正在更改参数,所以实际上复制Top10Data
参数不是一个好主意吗?或者它可能在某个地方被额外保留了一段时间。或者,该对象是从10大图像中访问的,并在某个地方保留了额外的时间。但泄漏的原因将超出提供的代码范围。
NSString * s = [someString substringFromIndex:1];
[myArray addObject:s];
// ...
NSString * s2 = [myArray lastObject];
instanceVariable = [s2 retain];
// ... and forget to release in dealloc