Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 用UISearchDisplayController填充表格视图会导致EXC\u坏访问!为什么?_Objective C_Ios_Exc Bad Access_Uisearchdisplaycontroller - Fatal编程技术网

Objective c 用UISearchDisplayController填充表格视图会导致EXC\u坏访问!为什么?

Objective c 用UISearchDisplayController填充表格视图会导致EXC\u坏访问!为什么?,objective-c,ios,exc-bad-access,uisearchdisplaycontroller,Objective C,Ios,Exc Bad Access,Uisearchdisplaycontroller,我用UISearchDisplayController做了一些测试,发现了一些无法正确解释的奇怪行为。 请查看以下代码: -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return numOfRecords; } - (NSArray*) search:(NSString*)query { // Prepare URL request t

我用UISearchDisplayController做了一些测试,发现了一些无法正确解释的奇怪行为。 请查看以下代码:

-(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;
}
使用EXC\u BAD\u访问权限在搜索字段中键入第二个字母后,程序崩溃


有人能解释一下导致此错误的原因吗?

您可能只需要保留它:

searchResult = [[NSArray arrayWithArray: entryTitles] retain];
您需要这样做,因为arrayWithArray刚刚创建了一个自动释放的对象,该对象将在不久的将来发布。您需要添加保留以获得所有权


一旦你拥有了所有权,别忘了在什么地方发布它。

我也遇到过同样的问题。我的问题是,在cellforrowatinexpath中,我将字符串值加载到单元格中以供显示后,释放了搜索结果数组中的对象

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

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

    return YES;
}
因此,当我试图搜索任何东西时,它立即崩溃了


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

实际上这应该不是问题,因为我使用“Objective-C自动引用计数”,因此我不允许使用retain。我使用ARC,因此无法保留它。谢谢,但给定的示例工作正常,我只是不明白,如果底部的赋值与带有数组副本的赋值不同,为什么它不起作用。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {

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

    return YES;
}