2013-08-21 53 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:] 

编辑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]; 
} 

编辑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]); 
     } 
    }]; 
} 

而在DAO

- (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 MB。 –

+0

检查你的递归​​调用,并确保你有一个终止条件,并且你不在无限递归循环中。放入一条NSLog语句,看看它被调用了多少次。 – JonahGabriel

+0

递归调用正常工作。 –