我的应用程序中有以下代码,并且'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]);
});
}
}];
}
}