在写完之前的两篇《Objective C学习》后,可以说基本掌握了OC的语法。虽然说基础很重要,但是为了不浪费不必要的时间,就不继续纯理论地研究OC语法了,还是直接写写demo,实践是最好的老师!
这两天在参照网上一篇文章学习了UITableView基本使用方法。文章写的很不错,代码详细而且讲解透彻。感谢作者,我终于可以写出第一个像样的demo了,而且大致了解一个简单的界面是如何组织与调度的了。
但是今天下午一直调试一个问题,后来才发现是一个“对象未初始化”的低级错误。
在demo使用UISearchController实现搜索框时。
//点击搜索框时触发这个方法
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
[_searchContacts removeAllObjects];
NSString *searchText = _searchController.searchBar.text;
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"(firstName CONTAINS[cd] %@) OR (lastName CONTAINS[cd] %@) OR (phoneNumber CONTAINS[cd] %@)",searchText,searchText,searchText];
[_contacts enumerateObjectsUsingBlock:^(id _Nonnull obj1, NSUInteger idx, BOOL * _Nonnull stop) {
ContactGroup *group =[_contacts objectAtIndex:idx];
NSArray *ret = [group.contacts filteredArrayUsingPredicate:searchPredicate];
[_searchContacts addObjectsFromArray:ret];//出问题的地方
}];
dispatch_async(dispatch_get_main_queue(), ^{
[_tableView reloadData];
});
}
运行时,发现始终没有任何搜索结果。于是一点一点的NSLog调试,发现其实ret是有值的,但_searchContacts没有数据。开始怀疑addObjectFromArray有什么特殊要求,但行不通。最后还是借助google找到了答案,原来我在最开始的时候只是声明了_searchContacts而并没有初始化。
NSMutableArray *_searchContacts;
突然想到,在之前学习OC的时候有说到这个特性。在OC中nil与其它语言的NULL有所不同,那就是nil也可以接受消息,不会 crash,只是返回nil罢了。在这里,我没有初始化,_searchContacts默认是nil的,那给它发送addObjectFromArray也是不会抱错的,但显然是什么都不做的,所以很难发现问题所在。
_searchContacts = [[NSMutableArray alloc] init];
教训##
使用任何对象时,想想是否给它初始化了。