У меня есть этот кусок кода:
- (void) resotreEntitySelectionForHistoryObject:(CoreDataHistoryObject *)historyObject {
OutlineViewNode *(^__block find)(OutlineViewNode *, NSString *) = ^OutlineViewNode *(OutlineViewNode *node, NSString *title) {
if ([node.title isEqualToString:title]) {
return node;
}
for (OutlineViewNode *child in node.childs) {
OutlineViewNode *result = find(child, title);
if (result) {
return result;
}
}
return nil;
};
OutlineViewNode *node = find(self.rootNode, historyObject.name);
if (node) {
[self.dataSourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:[self.dataSourceList rowForItem:node]] byExtendingSelection:NO];
}
}
И я получаю это предупреждение компилятора:
- CoreDataUtility/CoreDataUtil/MFLMainWindowController.m:230:39: строгий захват «find» в этом блоке, вероятно, приведет к циклу сохранения *
Именно в этой строке "OutlineViewNode *result = find(child, title);"
Я знаю решение просто создать метод вместо блока. Но теперь это заставило меня задуматься о том, как вы можете вернуть значение из блока.
Для справки вы можете просмотреть полный исходный код здесь:
https://github.com/yepher/CoreDataUtility/blob/master/CoreDataUtil/MFLMainWindowController.m#L224