记一次对象未初始化的调试

在写完之前的两篇《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];

教训##

使用任何对象时,想想是否给它初始化了。

你可能感兴趣的:(记一次对象未初始化的调试)