0

我正在尝试通过方法将委托传递给另一个对象。它短暂工作,但随后变为空。我想我已经弄清楚是什么原因造成的,但不知道如何解决它。

因此 iOS 中的 Blocks 会自动复制所有引用的变量。我有一个方法,用户传入一个委托对象。为托管对象上下文执行一个块,该上下文又发出一个 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 发布,因为它是副本而不是原件。

我怎样才能解决这个问题

4

2 回答 2

0

整理好了 我是个白痴,没有意识到我的 NSLog 输出说委托为空,实际上是一个完全不同的请求,以及块的内存管理。

于 2013-01-08T23:34:53.300 回答
-1

该块不会复制其中的对象,它只是捕获它们(增加 ARC 保留计数)。

我想您的委托是一个弱引用,因此它不会被块捕获。您可以通过向块传递对委托的强引用来解决此问题。

于 2013-01-08T22:55:05.970 回答