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

相關問題