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
)。它需要复制一个强引用。所以你应该将弱变量赋值给外部块主体中的强变量,让内部块捕获。
这里有很多积木!
我正在尝试使用块对字典中存在的每条记录执行操作。
我创建了 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
)。它需要复制一个强引用。所以你应该将弱变量赋值给外部块主体中的强变量,让内部块捕获。