3

だから私はこの本当に厄介なバグを修正しようとしています. 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クラスには、デリゲートのプロパティがありますassignfoosが空であっても問題は発生します。

4

1 に答える 1

1

PredicateTestViewController の dealloc メソッドでは、foo の割り当てを解除するのではなく、それらを解放する必要があります。

// Your code in PredicateTestViewController.m
- (void)dealloc
{
    [foos dealloc];
    [super dealloc];
}

// Your new code in PredicateTestViewController.m
- (void)dealloc
{
    [foos release];
    [super dealloc];
}
于 2009-11-06T22:53:01.873 に答える