0

我用UISearchDisplayController做了一些测试,发现了一些我无法正确解释的奇怪行为。 请在下面的代码来看一看:用UISearchDisplayController填充表视图会导致EXC_BAD_ACESS!为什么?

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  
    return numOfRecords; 
} 

- (NSArray*) search:(NSString*)query { 
    // Prepare URL request to download statuses from Twitter 
    NSString *urlString = [NSString stringWithFormat:@"http://someaddress/search.ac?term=%@", query]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 

    // Perform request and get JSON back as a NSData object 
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

    // Get JSON as a NSString from NSData response 
    NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 


    NSArray *parsedResult = [json_string JSONValue]; 
    return parsedResult; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *kCellID = @"cellID"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 

    int i = [indexPath row]; 
    if (i >= [searchResult count]) return cell; 


    NSString *res = [searchResult objectAtIndex:i]; 
    [[cell textLabel] setText:res]; 

    return cell; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 

    // WEB Request 
    NSArray *entries = [self search:searchString]; 

    numOfRecords = [entries count]; 

    NSMutableArray *entryTitles = [[NSMutableArray alloc] init]; 

    for (int i=0; i<numOfRecords; i++) { 
     NSDictionary *entry = [entries objectAtIndex:i]; 
     [entryTitles addObject:[entry objectForKey:@"title"]]; 
    } 

    searchResult = entryTitles; 

    return YES; 
} 

的信息搜索结果变量的类型的NSArray的成员变量。此代码工作正常,但是如果我的SearchResult的分配改为

searchResult = [NSArray arrayWithArray: entryTitles]; 

程序崩溃与一个EXC_BAD_ACCESS键入搜索字段中的第二个字母后。

有人可以解释导致此错误的问题是什么?

回答

0

你可能只需要保留它:

searchResult = [[NSArray arrayWithArray: entryTitles] retain]; 

你需要这样做,因为arrayWithArray刚刚创建,将在不久的将来发布一个自动释放对象。您需要添加您的保留以取得所有权。

一旦你拥有了所有权,不要忘记在某个地方发布它。

+0

我确实使用ARC,因此无法保留它。 – GeT 2012-02-27 20:33:19

0
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 

    // WEB Request 
    NSArray *entries = [self search:searchString]; 
    [searchResult autorelease]; 
    searchResult = [[entries valueForKeyPath:"@unionOfObjects.title"] retain]; 

    return YES; 
} 
+0

其实这应该不是问题,因为我使用'Objective-C自动引用计数',所以我不允许使用保留事件。 – GeT 2012-02-20 20:45:04

0

我跑过同一个问题。我的问题是,在cellForRowAtIndexPath中,我在将字符串值加载到单元格中以显示后释放搜索结果数组中的对象。

因此,当我试图搜索任何东西时,它立即崩溃。

检查以确保您没有释放您正在搜索的对象。

+0

谢谢,但给定的示例工作正常,我只是不明白为什么它不工作,如果底部的分配改变与数组副本的分配。 – GeT 2012-02-27 20:35:12