2012-02-22 96 views
0

我用下面的代码来填充一个UITableViewController使用NSPredicate来过滤数组造成第二EXC_BAD_ACCESS尝试

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    NSString *selectedWord; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    ResultDetail *detail = [[[GameStore defaultStore] currentResultDetail] objectAtIndex:[indexPath row]]; 

    if([[detail selectedWord] isEqualToString:@" "]) 
    { 
     selectedWord = @" selected: n/a"; 
    } 
    else{ 
     selectedWord = [NSString stringWithFormat:@" selected: %@", [[detail selectedWord] substringFromIndex:4]]; 
    } 
    [[cell textLabel] setText:[NSString stringWithFormat:@" %@ (score: %d/4)",[detail word],[detail score]]]; 
    [[cell detailTextLabel] setText:selectedWord]; 

    detail = nil; 
    [detail release]; 
    selectedWord = nil; 
    [selectedWord release]; 

    return cell; 
} 

上面的代码运行良好鉴于currentResultDetail的价值还没有被请求过。

这里是currentResultDetail

代码 - (NSArray的*)currentResultDetail {

NSLog(@"predicate: resultid == %d", [[GameStore defaultStore] currentResultId]); 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"resultId == %d", [[GameStore defaultStore] currentResultId] ]; 
    NSArray *filtered = [[[GameStore defaultStore] allResults] filteredArrayUsingPredicate:predicate]; // failed here but only if currentResultId has been requested before. 

    predicate = nil; 
    [predicate release]; 
    return [[filtered objectAtIndex:0] resultDetails]; 
} 

上面的代码失败上下面的行:

NSArray *filtered = [[[GameStore defaultStore] allResults] filteredArrayUsingPredicate:predicate]; 

所以基本上,如果用户请求currentResultId为1,2,3,4,5,6,7的顺序currentResultDetail,它工作正常。但是如果他们要求1,2,3,4,5,1就会崩溃。

任何指针为什么会发生这种情况?

回答

2

您的谓词返回autorelease。不要手动释放它,否则当autoreleasepool尝试释放它时会发生崩溃。