ReloadData上的EXC_BAD_ACCESS

时间:2010-02-26 23:47:52

标签: iphone objective-c xcode macos

我正在使用UISearchBar从API动态加载数据并尝试使用以下内容显示它:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
    NSLog(@"Search Text: %@",[searchBar text]);
    [self startSearchingWithText:[searchBar text]];
}
- (void) startSearchingWithText:(NSString *)text {
    ...
    // Go through the list of services and set up a query for the search term
    QueryServiceManager *manager = [[QueryServiceManager alloc] initWithServices: services];

    // Set up the query
    if (![manager addKeyword: text])
        NSLog(@"PROBLEM!");

    // Execute the query and store the titles in an array
    self.data = [[manager makeQuery] copy]; // Returns a NSArray

    NSLog(@"%@",self.data);

    // Add the items to the tableView

    [self.tableView reloadData];

我的UITableViewController代码设置为从self.data读取,最初是NSArray@""元素,因此:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    [self.data count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

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

    // Set up the cell...

    cell.textLabel.text = [self.data objectAtIndex:indexPath.row];

    return cell;
}

我这样做的全部是:

  

(gdb)继续   2010-02-26 18:43:32.515 iSave [11690:207](       “东芝Satellite L505-GS5037 TruBrite 15.6英寸笔记本电脑(黑色)”,       “戴尔Inspiron 11 11.6英寸黑曜石黑色笔记本电脑(Windows 7 Premium)”,       “华硕Eee PC贝壳1005PE-MU17-BK 10.1英寸黑色上网本 - 电池续航时间长达11小时”,       “SwissGear电脑背包(红色)”,       “贝尔金36件式消磁电脑工具套件(黑色)”,       “Compaq EVO N610C”,       “Belkin F8E062 55件电脑工具套件,带黑色外壳(消磁工具)”,       “华硕Eee PC贝壳1005PE-PU17-BK 10.1英寸黑色上网本 - 电池续航时间长达14小时”,       “Harman Kardon SoundSticks II 2.1即插即用多媒体音箱系统”,       “ION Audio VCR 2 PC USB VHS视频到电脑转换器”   )   (gdb)继续   程序接收信号:“EXC_BAD_ACCESS”。   (gdb)

有什么想法吗?看起来NSArray正在被正确填充,然后在reloadData调用之后/之后失败(断点确认了这一点,但无法隔离出错的地方)

编辑:我用枚举

替换了NSLog()
for ( NSString *elem in self.data ) 
    NSLog(elem);

它仍然崩溃。我设法哄骗了一个日志:http://pastebin.com/NDVKLsJC

当我完全删除NSLog()时,它不会崩溃,但UITableView也不会更新。

4 个答案:

答案 0 :(得分:4)

您是否确定了您尝试访问但不再存在的对象,即提供EXC_BAD_ACCESS的对象?

如果没有,那么你应该在你的应用程序中启用Zombies,然后你可以向gdb发出一个命令,告诉你哪个对象导致崩溃。

答案 1 :(得分:1)

奇怪的是:你说你在每个部分只有1行,但是你使用indexPath.row来索引你的数组?其中一个是错的,我猜它是第一个。通常,如果您在UITableView中显示一个数组( n 元素),则该部分中有一个部分和 n 行,这意味着您' d使用[myArray objectAtIndex:indexPath.row]检索适当的对象。

如果你想为数组中的每个项目单独添加一个部分,那么你说你有 n 部分,每个部分有1行,然后使用[myArray objectAtIndex:indexPath.section]来检索适当的对象。

哦,你在整个地方都在泄漏记忆。

答案 2 :(得分:0)

怎么样:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.data count];
}

而不是始终返回1

答案 3 :(得分:0)

点击shift-command-b分析项目并解决所有显示的问题(潜在泄漏等)