阻止/完成处理程序内存泄漏

时间:2016-01-27 15:42:43

标签: ios core-data memory-leaks objective-c-blocks completionhandler

我试图弄清楚为什么下面的代码保留了'​​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”]];'。这会阻止发布原始字典吗?

任何人都可以让我知道我是否应该在某处使用弱引用,或者在传递给某些函数/完成处理程序时复制原始字典?

0 个答案:

没有答案