だから私はこの本当に厄介なバグを修正しようとしています. NSPredicate を使用して理想的なバージョンのように配列をフィルター処理すると、EXC_BAD_ACCESS が返されます。これは、デリゲートとして渡されたオブジェクトのリリースを余分に呼び出そうとするためです。動作中のバージョンでフィルタリングすると、正常に動作します。これら2つの実装は同一だと思いました。どこが間違っていますか?述語の方法が進むべき道であることは知っていますが、正しく機能させることはできません。
// Ideal version
- (NSArray *)foosWithDelegate:(id)delegate {
return [foos filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"delegate = %@", delegate]];
}
// Working version
- (NSArray *)foosWithDelegate:(id)delegate {
NSMutableArray *results = [[NSMutableArray alloc] init];
for (MYFoo *foo in foos) {
if (foo.delegate == delegate) {
[results addObject:foo];
}
}
if ([results count] == 0) {
[results release];
return nil;
}
return [results autorelease];
}
foos
イヴァルです。MYFoo
クラスには、デリゲートのプロパティがありますassign
。foos
が空であっても問題は発生します。