我试图弄清楚为什么下面的代码保留了'dictionaryWithData'变量的内存。谁能告诉我通过完成处理程序发回对象的最佳方法,以及如何确保对象在之后正确释放?
// Convert JSON to dict
NSError *error = nil;
NSDictionary *dictionaryWithData = [NSJSONSerialization JSONObjectWithData:((DataURLConnection *)connection).data options:NSJSONReadingAllowFragments error:&error];
//dataConnection.data = nil;
dispatch_async(dispatch_get_main_queue(), ^{
if (((DataURLConnection *)connection).completion)
((DataURLConnection *)connection).completion(YES, dictionaryWithData);
}^;
然后我使用以下内容释放连接:
[connection cancel];
((DataURLConnection *)connection).data = nil;
((DataURLConnection *)connection).completion = nil;
connection = nil;
然而,在分析它时,我在dictionaryWithData对象上得到了803个泄漏。我注意到如果我注释掉调用函数代码:
...^(BOOL successful, id object) {
//[[CoreDataHandler coreDataHandler] createNewEntityOfType:@"TicketEntity" withDictionary:object];
//[[CoreDataHandler coreDataHandler] saveContext];
}
然后记忆也不再存在。 createNewEntityOfType函数的作用如下:
- (id)createNewEntityOfType:(NSString *)sEntity withDictionary:(NSDictionary *)dict
{
id entity = [NSEntityDescription insertNewObjectForEntityForName:sEntity inManagedObjectContext:context];
if ([entity isKindOfClass:[TicketEntity class]])
{
[entity setNID:dict[@"id"]];
}
return entity;
}
因此它将字典参数映射到相关的实体类型(上面是简化版本)。然后返回实体,而调用函数需要它。因此,唯一使用对原始dictionaryWithData对象的引用的是'[entity setNID:dict [@“id”]];'。这会阻止发布原始字典吗?
任何人都可以让我知道我是否应该在某处使用弱引用,或者在传递给某些函数/完成处理程序时复制原始字典?