我正在尝试通过方法将委托传递给另一个对象。它工作简单,但后来变为null。我想我已经弄明白是什么导致了它,但不知道如何解决它。
因此,iOS中的块会自动复制所引用的任何变量。我有一个方法,用户传入委托对象。为托管对象上下文执行块,该托管对象上下文又生成委托传递的Web请求。我认为正在发生的是,这个块正在制作委托对象的副本,并将其传递给请求,但随后块完成执行并释放委托。
有没有办法可以简单地传递原始委托对象,而不是制作副本的块?
NSManagedObjectContext *context = [[MPCoreDataManager sharedInstance] managedObjectContext];
[context performBlock:^{
__block NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([self class])];
[request setSortDescriptors:@[[[NSSortDescriptor alloc] initWithKey:key ascending:asc selector:@selector(caseInsensitiveCompare:)]]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:keyPath
cacheName:nil];
[controller performFetch:&error];
if (!controller.fetchedObjects || controller.fetchedObjects.count == 0) {
// Nothing found or an error, query the server instead
NSString *url = [NSString stringWithFormat:@"%@%@", kMP_BASE_API_URL, [self baseURL]];
MPRequest *objRequest = [MPRequest requestWithURL:url];
objRequest.delegate = delegate;
[objRequest setRequestMethod:@"GET"];
[MPUser signRequest:objRequest];
[objRequest submit:^(MPResponse *resp, NSError *err) {
if (err) {
block(nil, err);
} else {
NSArray *objects = [self createListWithResponse:resp];
objects = [MPModel saveAllLocally:objects forEntityName:NSStringFromClass([self class])];
[controller performFetch:&error];
block(controller, nil);
}
}];
} else {
// Great, we found something :)
block (controller, nil);
}
}];
这是我正在使用的代码。正如您所看到的,代理在此处使用objRequest.delegate = delegate;
但由ARC发布,因为它是副本而不是原始副本。
我如何解决这个问题
答案 0 :(得分:0)
排序好了。混淆了我是一个白痴,没有意识到我的NSLog的输出说委托是null是完全不同的请求,以及块的内存管理。
答案 1 :(得分:-1)
该块不会复制其中的对象,只是捕获它们(增加ARC保留计数)。
我认为你的委托是一个弱引用,由于这个原因,它不会被块捕获。您可以通过向块传递对委托的强引用来解决此问题。