我的应用程序中有以下代码,并且“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的任何明显原因,还是纯粹归结为调用类?
谢谢你的帮助
编辑(整个函数),只是为了确认我正在使用 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]);
});
}
}];
}
}