块和完成处理程序的最佳内存管理实践

时间:2015-11-24 17:56:17

标签: objective-c memory-management automatic-ref-counting objective-c-blocks completionhandler

我的应用程序中有以下代码,并且'dict'对象存在内存泄漏。所以我在代码之后对这方面的最佳实践提出了一些问题:

// Convert JSON to dict
                NSError *error = nil;
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

                dispatch_async(dispatch_get_main_queue(), ^{
                    // If error return nil
                    if (error)
                        completion(nil, [self handleSerializationError:error]);
                    else if (![UsefulFunctions objectContainsData:dict[@"data"]])
                        completion(nil, NO);
                    // No error then return dict
                    else
                        completion(dict, NO);
                });

关于代码:完成处理程序传回dict对象,然后用于根据调用函数创建核心数据实体(因此是主线程)。序列化的数据来自NSURLConnection。所以问题如下:

1)这是在完成处理程序中传回数据的正确做法吗?

2)哪个函数应该处理内存管理,它应该是调用类吗?

3)是否值得在自动发布池中包装它,或者不是它们应该如何使用(这是一个单独的问题)。

4)任何人都可以从这个函数中看到任何明显的原因,为什么dict被保留,或者它纯粹归结为调用类?

感谢您的帮助

EDIT(整函数),只是为了确认我正在使用ARC并且从主线程调用此函数:

- (void)downloadJSONFromURL:(NSURL *)url withCompletionHandler:(void (^)(id object, BOOL retry))completion
{
    // Check URL
    if (url)
    {
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        NSString *authToken = [NSString stringWithFormat:@"token %@", [UsefulFunctions returnActiveAPIKey]];
        [request setValue:authToken forHTTPHeaderField:@"Authorization"];
        [request setHTTPMethod:@"GET"];

        // Create an asynch request, don't want to hold up main queue
        [NSURLConnection sendAsynchronousRequest:request queue:[self operationQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
        {
            // If data exists
            if (data)
            {
                // Convert JSON to dict
                NSError *error = nil;
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

                dispatch_async(dispatch_get_main_queue(), ^{
                    // If error return nil
                    if (error)
                        completion(nil, [self handleSerializationError:error]);
                    else if (![UsefulFunctions objectContainsData:dict[@"data"]])
                        completion(nil, NO);
                    // No error then return dict
                    else
                        completion(dict, NO);
                });

            }
            // If error
            else if (connectionError)
            {
                //NSLog(@"Connection Error: %@, Code: %lu", connectionError.description, (long)connectionError.code);

                dispatch_async(dispatch_get_main_queue(), ^{
                    // Return nil
                    completion(nil, [self handleConnectionError:connectionError]);
                });
            }
        }];
    }
}

0 个答案:

没有答案
相关问题