Iphone子串导致内存泄漏

时间:2010-08-09 22:56:23

标签: iphone memory-leaks substring

我只是把我的应用程序包起来,所以即时通过运行仪器来识别应用程序中的泄漏。我遇到了一个漏洞,我无法理解为什么它被注册为泄漏。

我有以下几行:

NSString *imageType = [[[NSString alloc] initWithString:[loopString substringToIndex:[loopString rangeOfString:@"</IMAGE>"].location]] autorelease];
imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length];

所以基本上我所做的就是拉出“loopstring”的一部分并将其放入imagetype字符串,而不是使用SubstringFromIndex方法切断字符串的尾随绒毛。

当我运行仪器时,它会说“NSCFString substringwithRange”泄漏。它突出了第二行:

imageType = [imageType substringFromIndex:[imageType rangeOfString:@"<IMAGE>"].location + :@"<IMAGE>".length];

我认为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;

}

// ******************

3 个答案:

答案 0 :(得分:1)

它看起来不漏。但为什么

NSString *imageType = [[[NSString alloc] initWithString:
             [loopString substringToIndex:[loopString
                                             rangeOfString:@"</IMAGE>"].location]
         ] autorelease];

如果你有效地使用

NSString *imageType = [loopString substringToIndex:[loopString
                                             rangeOfString:@"</IMAGE>"].location];

占用内存的一半?

答案 1 :(得分:1)

泄漏会告诉您泄漏的内存已分配。如果你点击周围(我认为内存地址有一个右箭头图标),那么你可以查看该地址的所有分配/保留/发布。

在这个例子中,Leaks会指向第一行,当它是第五行“泄漏”时(实际上它是在dealloc / on assignment中泄漏的缺失版本):

NSString * s = [someString substringFromIndex:1];
[myArray addObject:s];
// ...
NSString * s2 = [myArray lastObject];
instanceVariable = [s2 retain];
// ... and forget to release in dealloc

tableView:cellForRowAtIndexPath:做什么?

答案 2 :(得分:1)

我在上面的代码中看不到任何问题。您是否在dealloc方法中发布了Top10Images