这几天碰到项目中一个bug,从一个列表进入任务详情页面,回复一条信息后,会导致列表中所有的cell点击进去全都是刚刚回复的那条任务详情。bug不细说,因为同事之前改过一个问题,有一个对列表数据赋值的操作,但是这个操作只会在接口调用完成后在详情控制器里进行,如果退出了,那么控制器销毁后就不会赋值,也就没有后来的bug。因此我检测了内存,调试了控制器的dealloc方法,果然,控制器没有被释放,应该是存在一些retaincycle导致的。
这个问题困扰了我三天,因为这个控制器有4个内嵌控制器,主控制器不能释放,4个内嵌控制器也不能释放,如果有几个retain环的话,那我碰巧改过一个之后,也解决不了问题,为了不引入新bug,只能改回去,这样就无解了。所以解决了一个之后必须记录下来,有思路。
这里比较重要的是,在arc下要打印出关注的控制器的retaincount。这里用到一个方法-
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)theVC));
在跳转过来的控制器中,用weak方式持有一个关注的控制器,就可以在这个关注的控制器被pop的时候打印他的值了。