NSURLSession和Connection可怕的内存泄漏

时间:2015-03-27 15:55:52

标签: memory-leaks ios8 xcode6 nsurlconnection nsurlsession

每次我通过NSURLSession / Connection向我的网络服务器发出请求都会泄漏!说实话,它并不多,但如果你要做几百或几千个电话,那就太讨厌了。

我已经有一个星期了。我尝试了一切。没有缓存,小缓存,在调用完成后将所有内容设置为nil(这是不必要的),使用数据任务进行会话或仅使用请求连接。每次我分配更多的内存,我没有找到解决这个问题的方法。

所以我设置了一个小testApp:

#import "ViewController.h"

@interface ViewController ()
@property NSString *param;
@property NSURL * url;
@property NSURLConnection *test;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];



    self.param = [NSString stringWithFormat:@"hi"];
    self.url = [[NSURL         alloc]initWithString:@"http://127.0.0.1/xmlfile.php"];
    for (int i = 0; i<20000; i++){
        [self connect:self.param url:self.url];
    }
    NSLog(@"I AM DONE!");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any   resources that can be recreated.
}


- (NSData *)connect:(NSString*)param url:(NSURL*)url{
    self.test = [[NSURLConnection alloc]initWithRequest:nil  delegate:self];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
       return nil;
}

@end

我很想添加内存使用的图像,但我太新了。 所以就这样: 5K:迭代 http://i59.tinypic.com/123tts2.png 20K: http://i59.tinypic.com/1zzqsrk.png

我听说这可能是ios8的一个问题。

请帮忙!

我对所有事情都持开放态度,如果有人能证明我错了并告诉我正确的方法,我会感到高兴。非常感谢

1 个答案:

答案 0 :(得分:0)

您实际上从未将您的网址转换为请求并将其提交给NSURLConnection。因此,连接将永远不会完成,并且其内存将保持分配状态。如果您将此代码添加到connect:url:方法中,您将发现上述代码与众不同:

NSURLRequest* request = [[NSURLRequest alloc] initWithURL:url];

...并将其传递到您的NSURLConnection,以便实际执行某些操作:

self.test = [[NSURLConnection alloc]initWithRequest:request  delegate:self];

...因为那时,一旦连接完成其工作 - 成功或其他 - 它的内存将被释放。