这条泄漏线背后的原因应该是什么?

时间:2009-11-07 06:01:13

标签: iphone memory-management memory-leaks

我已经完成了代码的和平,我已经指定了泄漏线。由于我是iPhone开发的新手,我无法理解该系列的实际问题。请看看那条线并告诉我。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    //take away
    //NSURL *url1 = [[NSURL alloc] initWithString:@"http://url/Service.asmx/takeAwayList"];
    NSURL *url1 = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"%@/Service.asmx/takeAwayList",serviceURL]];

    NSMutableURLRequest* request1=[NSMutableURLRequest requestWithURL:url1];
    [request1 setHTTPMethod:@"POST"];
    [request1 setTimeoutInterval:10];

    //*****the leaky line***********************///
    NSData *data2=[[NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil] autorelease];

    if(data2 == nil)
    {
        UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"The network is not available.\n Please check the Internet connection." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];

    }
    else
    {

        NSXMLParser *xmlParser1 = [[NSXMLParser alloc] initWithData:data2];

        //Initialize the delegate.
        TakeAwayParser *takeAwayParser = [[TakeAwayParser alloc] initTakeAwayParser];

        //Set delegate
        [xmlParser1 setDelegate:takeAwayParser];

        //Start parsing the XML file.
        @try {
            BOOL success = [xmlParser1 parse];
            if(success)
                NSLog(@"No Errors");
            else
                NSLog(@"Error Error Error!!!");
        }
        @catch (NSException * e) {
            NSLog(@"Exception in parsing %@  %@",[e name], [e reason]);
        }
        [takeAwayParser release];
        [xmlParser1 release];
    }

    //[request1 release];
//  [response1 release];
//  
    [url1 release];
//  [data2 release];
    //new arrivals
    //[data2 release];
    [pool release];

2 个答案:

答案 0 :(得分:2)

我的大型项目也存在问题。在与Apple工程师一起试图找到漏洞后,他终于向NSURLConnection背后的主要Apple开发团队询问了问题。他们基本上说在NSURLConnection中有一个内部缓存根本无法清除,这是一个已知的问题。

所以我开始寻找替代方案。我发现了ASIHTTPConnection(链接如下),它起作用于CFNetwork。它被设计成NSURLConnection的直接替代品,加上一堆其他令人敬畏的好东西,比如下载到磁盘而不是内存,下载恢复,进度条回调等等。

我在所有项目中都使用过它,从未遇到任何问题或投诉。答:回答你的问题,这就是我如何摆脱那些内存泄漏。

http://allseeing-i.com/ASIHTTPRequest/

答案 1 :(得分:1)

这条线没有泄漏,你甚至不应该自动释放它。

帮自己一个忙,阅读Apple开发人员文档中的内存管理指南,评论出代码中的版本并不是好兆头。

编辑:嗯我接受你的代码完全没问题,除了那一行。你确定它在泄漏吗?它返回一个保留计数为0的对象,因此你自动释放它应该会导致麻烦,因为它的保留计数为0。