所以我试图修复这个非常讨厌的bug。如果我像使用NSPredicate的理想版本一样过滤我的数组,我将获得EXC_BAD_ACCESS,因为它试图在作为委托传入的对象上调用释放额外的时间。如果我使用工作版过滤,它可以正常工作。我认为这两个实现是相同的。我哪里错了?我知道谓词方式是要走的路,只是不能让它正常工作。
// 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
为空,问题仍然存在。
答案 0 :(得分:1)
在PredicateTestViewController的dealloc方法中,你应该释放foos,而不是解除分配它们。
// Your code in PredicateTestViewController.m
- (void)dealloc
{
[foos dealloc];
[super dealloc];
}
// Your new code in PredicateTestViewController.m
- (void)dealloc
{
[foos release];
[super dealloc];
}