Memory leaks NSURLSession和Connection严重内存泄漏

Memory leaks NSURLSession和Connection严重内存泄漏,memory-leaks,ios8,xcode6,nsurlconnection,nsurlsession,Memory Leaks,Ios8,Xcode6,Nsurlconnection,Nsurlsession,每次我通过NSURLSession/连接向我的web服务器发出请求时,它都会泄漏!老实说,这并不多,但如果你不得不打几百个或几千个电话,这会很糟糕 我已经做了大约一个星期了。我什么都试过了。无缓存,小缓存,在调用完成后将所有内容设置为nil,这是不必要的,使用datatask进行会话或仅连接请求。每次我得到多一点的内存分配,我都没有找到解决这个问题的方法 所以我建立了一个小测试程序: #import "ViewController.h" @interface ViewController ()

每次我通过NSURLSession/连接向我的web服务器发出请求时,它都会泄漏!老实说,这并不多,但如果你不得不打几百个或几千个电话,这会很糟糕

我已经做了大约一个星期了。我什么都试过了。无缓存,小缓存,在调用完成后将所有内容设置为nil,这是不必要的,使用datatask进行会话或仅连接请求。每次我得到多一点的内存分配,我都没有找到解决这个问题的方法

所以我建立了一个小测试程序:

#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:迭代 20k:

我听说这可能是ios8的问题

请帮忙


我对一切都持开放态度,如果有人能证明我错了,给我指明正确的方向,我会很高兴。非常感谢

您从未真正将URL转换为请求并将其提供给NSURLConnection。因此,连接将永远不会完成,其内存将保持分配状态。如果将其添加到connect:url:method中,您会发现上述代码有很大的不同:

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

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

…因为这样,一旦连接成功完成其工作,否则其内存将被释放。

遗憾的是,什么也没有改变。这实际上是我在遇到这个问题之前在应用程序中实现它的方式。请自己试一试我在发帖前自己试一试。我运行了您的原始代码,在模拟器中看到不断增加的内存使用在8GB左右达到峰值。我用我的修改运行了它,它的速度稳定在700MB左右。我的代码唯一的另一个区别是,我在http://localhost/ 而不是http://127.0.0.1/xmlfile.php 我显然没有。有没有可能您的PHP文件没有正确返回,或者什么的?顺便说一句,当它在700MB左右变平后,响应开始出现,并且随着所有20000个响应的处理,内存使用逐渐减少。您确实意识到您实际上同时在排队等待20000个异步连接,并且您的设备可能会因此而有些不知所措,对吗?在模拟器中,它像一个剧团一样进行着,几分钟后,它成功地通过了所有20000次。我猜堆栈中有保护,可以阻止你太用力地攻击服务器。
self.test = [[NSURLConnection alloc]initWithRequest:request  delegate:self];