停止复制变量的块

时间:2013-01-08 22:50:07

标签: objective-c ios cocoa-touch objective-c-blocks

我正在尝试通过方法将委托传递给另一个对象。它工作简单,但后来变为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发布,因为它是副本而不是原始副本。

我如何解决这个问题

2 个答案:

答案 0 :(得分:0)

排序好了。混淆了我是一个白痴,没有意识到我的NSLog的输出说委托是null是完全不同的请求,以及块的内存管理。

答案 1 :(得分:-1)

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

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