Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导致内存泄漏的Iphone子字符串_Iphone_Memory Leaks_Substring - Fatal编程技术网

导致内存泄漏的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