NSURLConnection sendSynchronousRequest 内存泄露

    底层通过函数指针调用我在上层写一个同步下载接口,加载卫星图。用的就是[NSURLConnection  sendSynchronousRequest] ;因为是用ARC,内存已经拷贝到底层,我说肯定是底层的问题。然后我们得C++工程师就苦逼得改代码,最后还是确定是上层下载的问题。

int st_get_downLoad_its_by_url(char* pUrl , int nUrlLen , unsigned char* pDestBuf , int& nRealLength , int nMaxLen)
{
    NSString *  strUrl = [[NSString alloc] initWithUTF8String:pUrl];
    
    strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:strUrl];
    
    NSError *err = nil;;
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10 ];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&err];
    if (err) {
        return 0;
    }
    unsigned char* pTempDestBuf = (unsigned char*)[responseData bytes];
    nRealLength = (int)[responseData length];

    if ( nRealLength > nMaxLen ) {
        nRealLength = nMaxLen ;
    }
    memcpy(pDestBuf, pTempDestBuf, nRealLength);
    responseData =nil;
    return 1;
}    

     我当时就想就这几行代码哪有内存泄漏,一定是你们底层没处理好,后来发现我错了就是这简单得几行代码导致了内存泄漏 ,百度发现有人和我类似的问题但是没有解决办法http://www.cocoachina.com/bbs/read.php?tid-27519-page-1.html 他是时间间隔小,我们是同时开四个线程。

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&err];


    第一想法加 @autoreleasepool 和网上说得一样没效果。

    后来一想既然你不能及时释放,那我把你封装到一个对象里面,让一个对象去管理你,是不是就可以解决内存的问题:

@autoreleasepool {

        STDownImageObj *downImage = [[STDownImageObj alloc]  init];
        bool res =  [downImage downImage:pUrl urlLength:nUrlLen buttfer:pDestBuf Length:nMaxLen];
        downImage = nil;
        return res;
    }       
  编译测试果然像我想象的一样。最后对被我坑的底层开发人员表示深深得歉意。

你可能感兴趣的:(内存泄露)