Objective c块中块

Objective c block in a block

这里有很多积木!

我正在尝试使用块对字典中存在的每条记录执行操作。

我创建了 strongRecordBlock 的弱引用,并使用它在 strongRecordBlock 中调用自身。在我介绍我需要执行的实际操作 (DataManager addRecord) 之前,一切都很好,而这又是一个块。 所以现在有一个例外,weakRecordBlock 在递归循环的第一次迭代后为 null。谁能指导一下!

__weak __block void (^weakRecordBlock)(int i);

        void (^strongRecordBlock)(int) = ^(int i) {
            NSString *key = weakSelf.recordDictionary.allKeys[i];
            CSVRecord *record = [weakSelf.recordDictionary objectForKey:key];
            NSLog(@"%d %@", i, record.recordFullname);
            [[DataManager sharedInstance] addRecord:record onSuccess:^(NSString *objectId) {
                if (i < weakSelf.recordDictionary.allKeys.count-1) {
                    weakRecordBlock(i+1);//Crashes here
                }
                else {
                    completedBlock();
                }
            } onError:^(NSError *error) {
                onError(error);
            }];


        };
        weakRecordBlock = strongRecordBlock;
        strongRecordBlock(0);

问题是您正试图在块内使用弱指针。它导致在第一个 运行 循环之后实现弱点。

因此您需要在strongRecordBlock 内部创建对weakRecordBlock 的强引用。因此,只需将这行代码添加到您的 strongRecordBlock

 void (^strongPointerToWeakRecordBlock)(int i) = weakRecordBlock;

并将weakRecordBlock(i+1)替换为strongPointerToWeakRecordBlock(i+1)

RomanSalabay 的回答是正确的。问题是 -[DataManager addRecord:record onSuccess:] 执行其参数块 异步 。因此,该块(-[DataManager addRecord:record onSuccess:] 的参数)需要保持对其中使用的对象和块的强引用,以使它们在块运行之前保持活动状态;否则它们可以在块运行时被释放。但它捕获了一个弱引用 (weakRecordBlock)。它需要复制一个强引用。所以你应该将弱变量赋值给外部块主体中的强变量,让内部块捕获。