0

我正在使用 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]);
        }
    }];
}

而在道

- (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) {
                              .
                              .
                              .


                          }];

}

谢谢!

4

2 回答 2

0

您的完成块中有保留周期。您不应在任何块中引用“self”。尝试做这样的事情

__weak MyClass *wSelf = self;
MyCompletionBlock completionBlock = ^{
    __strong MyClass *sSelf = wSelf;
   [sSelf doThings];
}
于 2013-08-21T19:27:07.460 回答
0

这些是来自应用程序共享NSURLCache实例的分配。

如果我尝试启动另一个请求,应用程序会多次收到内存警告,因此它会被迫关闭。

NSURLCache发出内存警告时,应自动丢弃其内存中缓存。我不确定您所说的“它被迫关闭”是什么意思,但这很可能是您在触发内存警告时释放视图控制器中未使用的内存的问题。

于 2013-08-25T16:42:09.467 回答