休了一阵子假期,今天刚回来上班,项目代码已经有挺大的变化了,我就先体验、发现、跟进问题。
第一个问题是点击某个cell就挂掉的现象,同事表示必现但挺神奇。由于挂掉的时候没有啥有意义的信息,所以先简单粗暴地在
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
打个断点,结果还没命中就挂了。再一看cell的布局,发现是在一个UITableViewCell对象的contentView上面addSubview一个由nib文件加载进来的UI控件,在这个控件中有响应touch事件:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
很遗憾同样还没命中断点就挂了,所以我尝试增加了如下函数:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
结果很意外地发现好了。但是如果将事件传递给super时,依然会挂。从而定位到是上一级视图的问题,后来发现是这么一行代码:
cell.selectedBackgroundView = [[UIView alloc] autorelease];
漏掉初始化了。
第二个问题是在传参过程中,直接将NSNumber指针赋值给BOOL变量,而不是取其boolValue。
直接用@(0)对BOOL值赋值,而不是[@(0) boolValue];
第三个问题是在UITableView的headerView上结合searchBar控件遇到的,在非ARC的dealloc代码中,挂在:
[super dealloc];
这个比较容易联想到二次释放,所以我直接先采用Profile工具做一次NSZombie的检查,令人开心的是中了,令人遗憾的是没有定位到太有价值的代码行。
但是可以基本推断出跟UITableView及其headerView有一定关系。又由于场景是可以重现的,所以通过注释掉dealloc函数里德其它代码定位到是tableView释放时引发的,但经常反复检查,确认没有二次释放,最终发现通过以下代码可以避免:
self.tableView.tableHeaderView = nil;
这点倒没有完全理清楚,目前怀疑是引用searchBarController和searchBar时,一些引用技术上引发的问题。
……