这个bug大概是这样子,我打出的包,装到真机上,会crash。但是在模拟器甚至连接真机进行联调时,一切正常。拿到crash日志跟踪时,因为报错的方法包含的代码太大了,所以很难找出原因在哪里。
1、bug的起源来自下面一行前人留下的“古老”代码:
@property (nonatomic, assign) Pair *curSort;
代码中是这样使用这个curSort变量的,首先对它进行初始化:
self.curSort = [NVObjectUtil pairWithId:[urlAction stringForKey:@"sort"] name:nil type:0];
然后,在后面会有逻辑使用这个字段:
if (self.curSort)
{
self.currentDataSource.curSortPair = self.curSort;
}
以及后面在使用这个self.currentDataSource.curSortPair进行了一系列的赋值操作。
2、到底是什么原因造成了crash,当用assign修饰一个属性变量时,而且这个属性变量不是基本属性变量时,它的赋值操作就不会改变引用计数,会被ARC即时给清理掉。所以,self.currentDataSource.curSortPair指向的内存区域的值,被释放掉了。而此时self.currentDataSource.curSortPair就会指向一片“未知的”内存区域,成为了闻名遐迩的“野指针”,如果运气好,指向的内存区域值可能不会crash你的app,运气不好的话,就会造成一些你意想不到的后果,当然直接crash算是最直观的现象了。所以改为如下即可:
@property (nonatomic, strong) Pair *curSort;