这里有很多街区!
我正在尝试使用块对字典中的每条记录执行操作。
我创建了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);
答案 0 :(得分:2)
问题是你试图在块内使用弱指针。并且它导致在第一次运行循环后实现弱点。
因此,您需要在strongRecordBlock内部创建对weakRecordBlock的强引用。所以只需在strongRecordBlock
之上添加这行代码即可 void (^strongPointerToWeakRecordBlock)(int i) = weakRecordBlock;
并将 weakRecordBlock(i + 1)替换为 strongPointerToWeakRecordBlock(i + 1)
答案 1 :(得分:2)
RomanSalabay的回答是正确的。问题是-[DataManager addRecord:record onSuccess:]
异步执行其参数块 。因此,该块(-[DataManager addRecord:record onSuccess:]
的参数)需要对其中使用的对象和块保持强引用,以使它们保持活动直到块运行;否则它们可以在块运行时解除分配。但它捕获了一个弱引用(weakRecordBlock
)。它需要复制一个强引用。因此,您应该将弱变量分配给外部块体中的强变量,以便捕获内部块。