使用Aspects遇到exc_bad_access的问题

项目中需要对某些事件进行统计,我直接使用了Aspects的;
问题发送在当Aspects对控制器的viewDidDisappear:进行hook,如果触发此回调且恰好此控制器被释放时,并使用Aspects内部回调的值,就会发生exc_bad_access

使用Aspects遇到exc_bad_access的问题_第1张图片
Snip20170528_22.png

原因:
当hook回调之前已经执行了该控制器的dealloc,那此时hook的对象已经被释放了;
查看了Aspects的源码,block回调的参数就是AspectInfo类的,发现AspectInfo类中给instance成员使用unsafe_unretained声明,由于此特性在对象销毁时,会依然指向之前的内存空间(野指针),不像__weak会在释放时置为nil;
最终导致收到回调时[data instance]的isa指针指向了已经释放的内存空间,因为此时hook的这个类对象已经被释放了,所以[data instance]就会报坏内存访问

解决方法:
不使用这个回调的值的就不会发生此问题,
或者修改自行修改框架,将instance特性由unsafe_unretained修改为__weak;
github上可以看到此框架3年前写的,大神可能忽略了此问题或者其他问题,最好能给大神提个问题,看大神怎么说吧;

这里有个Demo

你可能感兴趣的:(使用Aspects遇到exc_bad_access的问题)