zoukankan      html  css  js  c++  java
  • 随手记今天跟的几个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的检查,令人开心的是中了,令人遗憾的是没有定位到太有价值的代码行。

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

    self.tableView.tableHeaderView = nil;


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

    ……

  • 相关阅读:
    [HEOI2015]兔子与樱花
    [HNOI2015]亚瑟王
    [JSOI2011]分特产
    某考试 T3 sine
    [JSOI2015]最小表示
    51NOD 1258 序列求和 V4
    Codeforces 622F The Sum of the k-th Powers
    Loj #6261. 一个人的高三楼
    [HAOI????] 硬币购物
    bzoj4318 OSU!
  • 原文地址:https://www.cnblogs.com/riasky/p/3431081.html
Copyright © 2011-2022 走看看