我正在使用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
也不会更新。
答案 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分析项目并解决所有显示的问题(潜在泄漏等)