2013-08-21 3 views
0

Я использую AFNetworking для отправки запросов, но когда запрос завершает работу, я получаю это выделение памяти в инструментах, и они остаются там навсегда ... Если я попытаюсь запустить другой запрос, приложение получит память предупреждение несколько раз и, следовательно, он вынужден закрыть.Выделение с использованием запроса AFNetworking

Graph Category Live Bytes # Living # Transitory Overall Bytes # Overall # Allocations (Net/Overall) 
1 CFString (store) 4,86 MB 29 3595 30,78 MB 3624 <XRRatioObject: 0x7ffd1c5dc3f0> %0.00, %0.17 
1 Malloc 3,91 MB 3,91 MB 1 1 7,83 MB 2 <XRRatioObject: 0x7ffd1c5dc3f0> %0.00, %0.00 

И внутренние распределения для каждого из:

Первый

# Address Category Timestamp Live Size Responsible Library Responsible Caller 
0 0x4d28000 CFString (store) 01:12.165.450 • 4923392 CFNetwork _ZL19_cacheKeyForRequestPK13_CFURLRequest 
1 0x36b8000 CFString (store) 00:54.705.461 • 172032 CFNetwork _ZL19_cacheKeyForRequestPK13_CFURLRequest 
2 0x1e3f5a00 CFString (store) 01:12.326.108 • 1024 CFNetwork _ZL19_cacheKeyForRequestPK13_CFURLRequest 

Второй

# Address Category Timestamp Live Size Responsible Library Responsible Caller 
0 0x6903000 Malloc 3,91 MB 01:01.583.198 • 4104192 Foundation -[NSConcreteMutableData initWithLength:] 

Edit 1

Вот код, который мы используем для создания запросов:

// Do a json request 
+ (void) doJsonRequestWithPath 
: (NSString *) path 
withMethod: (NSString *) method 
withParameters: (id) parameters 
withHeaders: (NSDictionary *) headers 
onSuccess: (void(^)(NSURLRequest *, NSHTTPURLResponse *, id))success 
onFailure: (void(^)(NSURLRequest *, NSHTTPURLResponse *, NSError *, id))failure 
{  
    // Register json request operation 
    [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
    // Json parameter encoding 
    [httpClient setParameterEncoding:AFJSONParameterEncoding]; 

    NSMutableURLRequest *request; 


    if ([parameters isKindOfClass:[NSDictionary class]]) { 
     // Create a request with the http client + path and params 
     request = [httpClient requestWithMethod:method path:path parameters:parameters]; 
    } 
    else { 
     request = [httpClient requestWithMethod:method path:path parameters:nil]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
     //[request setValue:@"100-continue" forHTTPHeaderField:@"Expect"]; 
     [request setHTTPBody:[parameters dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 

    [request setCachePolicy:NSURLRequestReloadIgnoringCacheData]; 
    [request setTimeoutInterval:20]; 

    // Add headers to the request if there is any 
    if (headers != nil) 
     [self addHeadersToRequest:request fromDictionary:headers]; 

    // Create a json request operation 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:success failure:failure]; 



    // Starts the operation 
    [operation start]; 
} 

Edit 2

У нас есть рекурсивный вызов

- (void)sendFingerprintAtIndex:(NSInteger) index withGuid:(NSString *) guid 
{ 
    SendActivationRequest *sendActivationRequest = [[SendActivationRequest alloc] 
                initWithGuid: guid 
                andWithTotalImages:4 
                andWithImageIndex:index 
                andImageType:2 //digital 
                andWithImage:image]; 

[self.activationDao sendActivationRequest:sendActivationRequest withCompletionBlock:^(NSString *hash, NSArray *errors) {   
     if (hash) { 

       . 
       . 
       . 
      } 
      else { 
       // recursive call 
       [self sendFingerprintAtIndex:newIndex withGuid:guid]; 
      } 
     } 
     else 
     { 
      self.completionBlockController(NO, [errors objectAtIndex:0]); 
     } 
    }]; 
} 

И в Дао

- (void) sendActivationRequest:(SendActivationRequest *) sendActivationRequest withCompletionBlock:(void (^)(NSString *, NSArray *))completionBlock 
{ 
    // Path 
    NSString *path = @"EnviarAtivacao"; 

    id params = [sendActivationRequest getParams]; 
    NSDictionary *headers = [sendActivationRequest getHeader]; 

     // Do a json post request 
    [self doJsonPostRequestWithPath:path 
        withParameters:params 
         withHeaders:headers 
          onSuccess:^(NSURLRequest *request, NSHTTPURLResponse *response, id json) { 
           . 
           . 
           .     

          } onFailure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *err, id json) { 
           . 
           . 
           . 


          }]; 

} 

Спасибо!

+0

Можете ли вы привести пример кода, показывающий, как вы используете AFNetworking? – Jeff

+0

Я предполагаю, что у вас есть цикл сохранения в вашем успехе или сбое. Основываясь на распределении объектов XRRatioObject, я предполагаю, что он имеет какое-то отношение к структуре Sparrow. Можете ли вы опубликовать, как вы называете этот метод? –

+0

Возможно, рекурсивный вызов - проблема Аарона. Как вы думаете? –

ответ

0

Это ассигнования из общего NSURLCache экземпляра приложения.

Если я попытаюсь запустить другой запрос, приложение получает предупреждение о памяти несколько раз и, следовательно, оно принудительно закрывается.

NSURLCache должен автоматически отбрасывать свой кеш в памяти при выдаче предупреждения о памяти. Я не уверен, что вы подразумеваете под «принудительным закрытием», но это может быть проблемой того, что вы освобождаете неиспользуемую память в контроллерах вашего вида при срабатывании предупреждения о памяти.

+0

Спасибо за вашу помощь mattt, я решил это, отключив кеш, это нормально, или у меня будут проблемы с этим? –

0

Вы сохраняете циклы в своих блоках завершения. Вы не должны ссылаться на «я» в любых блоках. Попробуйте сделать что-то вроде этого

__weak MyClass *wSelf = self; 
MyCompletionBlock completionBlock = ^{ 
    __strong MyClass *sSelf = wSelf; 
    [sSelf doThings]; 
} 
+0

Не работал, менял его для всех блоков, но распределения продолжали расти почти до 100 МБ. –

+0

Проверьте свой рекурсивный вызов и убедитесь, что у вас есть условие завершения, и что вы не находитесь в бесконечном рекурсивном цикле. Поместите инструкцию NSLog и посмотрите, сколько раз она вызывается. – JonahGabriel

+0

Рекурсивные вызовы работают правильно. –