我见过其他几个相同形式的问题,但我要么 a) 无法理解所提供的答案,要么 b) 看不出这些情况与我的情况有何相似之处。
我正在 UIView 上编写一个类别,以递归地评估 UIView 的所有子视图并返回一个通过测试的子视图数组。我已经注意到我的编译器警告发生在哪里:
-(NSArray*)subviewsPassingTest:(BOOL(^)(UIView *view, BOOL *stop))test {
__block BOOL *stop = NO;
NSArray*(^__block evaluateAndRecurse)(UIView*);
evaluateAndRecurse = ^NSArray*(UIView *view) {
NSMutableArray *myPassedChildren = [[NSMutableArray alloc] init];
for (UIView *subview in [view subviews]) {
BOOL passes = test(subview, stop);
if (passes) [myPassedChildren addObject:subview];
if (stop) return myPassedChildren;
[myPassedChildren addObjectsFromArray:evaluateAndRecurse(subview)];
// ^^^^ Compiler warning here ^^^^^
// "Capturing 'evaluateAndRecurse' strongly in this block
// is likely to lead to a retrain cycle"
}
return myPassedChildren;
};
return evaluateAndRecurse(self);
}
__block
此外,当我在块的声明中不包含修饰符时,我会遇到 bad_access 失败(^__block evaluateAndRecurse)
。如果有人可以解释为什么会这样,那也将非常有帮助。谢谢!