3

所以我正在尝试修复这个非常烦人的错误。如果我像使用 NSPredicate 的理想版本一样过滤我的数组,我将得到 EXC_BAD_ACCESS,因为它会尝试在作为委托传入的对象上调用 release 额外时间。如果我使用工作版本进行过滤,它可以正常工作。我认为这两个实现是相同的。我哪里错了?我知道谓词方式是要走的路,只是不能让它正常工作。

// 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为空,问题仍然存在。

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 回答