使用NSMutableArray的另一个内存泄漏

时间:2012-01-03 10:38:06

标签: iphone xcode memory-leaks nsmutablearray

我提供了有关代码的更多信息。每隔5秒钟调用checkstatusthread()。下面使用的ipItemsArray对象存储来自服务器的XML。

// XMLAppDelegate.h

@interface XMLAppDelegate : NSObject <UIApplicationDelegate> {
    NSMutableString *hostStr2;
    NSData *dataURL2;
    NSString *playlistdata;

}

@property (nonatomic, retain) NSMutableString *hostStr2;
@property (nonatomic, retain) NSData *dataURL2;
@property (nonatomic, retain) NSString *playlistdata;
@end

// XMLAppDelegate.m

-(void)checkstatusthread
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    hostStr2 = [[NSMutableString alloc] initWithFormat:@"http://%@/getplaylist.php?ip=%@",yourip,restip];

    dataURL2 = [NSData dataWithContentsOfURL: [ NSURL URLWithString: hostStr2 ]];  

    playlistdata = [[NSString alloc] initWithData:dataURL2 encoding: NSASCIIStringEncoding];

    ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"];

    [hostStr2 release]; 
    [playlistdata release];

    status =[ipItemsArray objectAtIndex:0];
    [status retain];

     if([[ipItemsArray objectAtIndex:0]isEqualToString:@"0001"])
     { 
        serverOutput1 =[ipItemsArray objectAtIndex:1];
        [serverOutput1 retain];

        nowplaying =[ipItemsArray objectAtIndex:2];    
        [nowplaying retain];

        tracklocation=[ipItemsArray objectAtIndex:3];
        [requestlocation retain];

        requestlocation=[ipItemsArray objectAtIndex:4];
        temp_app =[tracklocation intValue];


     }

        [serverOutput1 retain];
        [nowplaying retain];
        [serverOutput1 retain];
        [nowplaying retain];
        [tracklocation retain]; 
        [requestlocation retain];

        // checkstatus() called
        [self performSelectorOnMainThread:@selector(checkstatus) 
                           withObject:nil 
                        waitUntilDone:false];

    [pool drain];
}


- (void)dealloc {
    [dataURL2 release];
    [playlistdata release];
    [ipItemsArray release];
}

当我在Xcode 4.2中运行泄漏工具时, NSArray *ipItemsArray = [playlistdata componentsSeparatedByString:@"|^|"]; 行给了我内存泄漏。我已经尝试了所有可能的事情,但感觉需要添加一些东西。有人可以帮帮我。

这是泄漏对象的屏幕截图。另外我注意到我的应用程序没有调用Dealloc方法。

enter image description here

3 个答案:

答案 0 :(得分:1)

实际上分析器指向你这行代码:

NSMutableString *hostStr2 = [[NSMutableString alloc] initWithFormat:@"http://   %@/getplaylist.php?ip=%@",yourip,restip];

您已分配但尚未发布。

你需要释放它。

答案 1 :(得分:1)

泄漏的对象是“状态”。我推断这是一个iVar。当你这样做时:

 status =[ipItemsArray objectAtIndex:0];
[status retain];

这些行第二次执行时,先前存储的状态值未正确释放,因此泄漏。理想情况下你应该这样做:

if(status) {
    [status release];
}
status =[ipItemsArray objectAtIndex:0];
[status retain];

这将解决仪器中显示的泄漏问题。 (假设没有使用ARC)

答案 2 :(得分:0)

你所做的一切都是正确的。并非泄漏仪器显示的每一个泄漏都是泄漏。

我建议您在第一步使用Clang Analyzer XCode - &gt;产品 - &gt;分析。这显示了一些潜在的泄漏。在此之后,您应该使用快照分析http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/