同じ形式の他の質問をいくつか見ましたが、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)
。誰かがその理由を説明できれば、それも非常に役立ちます。ありがとう!