随手记今天跟的几个iOS项目代码的问题

休了一阵子假期,今天刚回来上班,项目代码已经有挺大的变化了,我就先体验、发现、跟进问题。

第一个问题是点击某个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的检查,令人开心的是中了,令人遗憾的是没有定位到太有价值的代码行。

随手记今天跟的几个iOS项目代码的问题

但是可以基本推断出跟UITableView及其headerView有一定关系。又由于场景是可以重现的,所以通过注释掉dealloc函数里德其它代码定位到是tableView释放时引发的,但经常反复检查,确认没有二次释放,最终发现通过以下代码可以避免:

self.tableView.tableHeaderView = nil;

这点倒没有完全理清楚,目前怀疑是引用searchBarController和searchBar时,一些引用技术上引发的问题。

……

上一篇:UITableview delegate dataSource调用探究


下一篇:java四大会话技术