NSURLSession周围的内存泄漏

时间:2016-07-13 20:31:36

标签: ios objective-c memory-leaks nsurlsession

我注意到代码中NSURLSession周围的内存泄漏。

Leak seen on Instruments

以下是我的应用中使用NSURLSession的代码:

-(void)createWithUserId:(NSString*)userId andAccountNumber:(NSString*)accountNumber
{

    NSURL *url = [NSURL URLWithString:[WebServiceUtility getCreateBatchURLWithBaseURL:self.baseURL]];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[WebServiceUtility getSessionConfigurationWithRequestHeader:(NSDictionary*)self.requestHeader andTimeout:self.requestTimeout]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    request.HTTPMethod = kCMDCPOSTMethod;

    NSDictionary *dictionary = self.requestBody;
    NSError *error = nil;
    NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary
                                                   options:kNilOptions error:&error];

    if (!error) {

        NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request
                                                                   fromData:data completionHandler:^(NSData *data,NSURLResponse *response,NSError *error) {

                                                                       if([[WebServiceUtility getStatusCodeForResponse:response] isEqualToString:kCMDCStatusCode_200] && data)
                                                                       {

                                                                           NSMutableDictionary *json = [WebServiceUtility dictionaryFromData:data];
                                                                           [self.delegate createdWithResults:json];
                                                                       }
                                                                       else
                                                                       {
                                                                           NSMutableDictionary *json=[[NSMutableDictionary alloc]init];
                                                                           [json setObject:kCMDCServerError_1 forKey:kCMDCServerError];

                                                                           [json setObject:[WebServiceUtility getStatusCodeForResponse:response] forKey:kCMDCStatusCode];
                                                                           [self.delegate createdWithResults:json];
                                                                       }
                                                                   }];

        [uploadTask resume];
    }
}

1 个答案:

答案 0 :(得分:0)

我知道这是一篇非常古老的文章,但是我碰到了这一点,并且我已经确定这是内部Apple API的问题。我相信我看到的泄漏与您的泄漏相同。一整天试图找出原因后,我发现泄漏仅在我的设备(或模拟器)通过代理(例如Charles或Fiddler)运行时显示。禁用代理,问题就消失了。

为此,我已向Apple提交了雷达报告。这是一个极端的情况,因为大多数最终用户不会在其设备上使用代理,但是开发人员通常使用代理来调试网络呼叫,并且使用NSURLSession并具有代理集的任何人都会看到此泄漏。在Openradar重复的问题:https://openradar.appspot.com/radar?id=6140533516795904