今天在仿写微博APP的时候遇到了一个问题,编译运行,下拉刷新微博,一切正常,再次下拉刷新,程序就崩了,Xcode报错,EXC_BAD_ACCESS(code=1,花了好长时间才发现是哪里错了,现在在这里总结一些可能会到这这个错误产生的问题。
当Xcode报错的时候会定位到某一行,但是却没有详细的信息,比如我的程序中,代码就定位到了
params[@"since_id"] = firstStatus.idstr;
这一行。在网上搜索相关问题的答案,发现产生这个问题主要的原因是,当某个对象被完全释放,再去通过该对象去调用其它的方法就会出现野指针错误。
有一种定位错误产生位置的方法,我这里就无耻的copy过来:
Edit Scheme->Arguments->Environment variables
增加 NSZombieEnabled ,设置为YES,并勾选上,OK,再次运行,在console就会显示出出错的地方了。
定位到哪个对象产生问题了之后我发现我还是找不到具体是哪个对象,因为我打了断点的对每一个对象一步步的分析地址都没有找到合适的对象,那么问题产生在哪里呢?
这时候我重新考虑了问题产生的原因:当某个对象被完全释放,再去通过该对象去调用其它的方法就会出现野指针错误。
既然一开始Xcode已经定位到了
params[@"since_id"] = firstStatus.idstr;
这一行,那么应该就是这个对象产生了问题,params对象是刚刚创建的可变数组对象,应该不是它的问题,那么问题就有可能出现在firstStatus对象上,返回firstStayus对应的类,我发现了问题,idstr是一个NSString对象,可是我在声明这个属性的时候用的却是assign,assign是用在基本类型的数据上的,而不是对象类型,存方法会将传入的值直接赋给实例变量,它并不会使对象的引用计数加1,所以在赋值完成之后,对象就被release了,因此产生了野指针的问题,idstr的改为copy之后问题就解决了。