項目中需要對某些事件進行統(tǒng)計,我直接使用了Aspects的师枣;
問題發(fā)送在當Aspects對控制器的viewDidDisappear:
進行hook,如果觸發(fā)此回調且恰好此控制器被釋放時,并使用Aspects內部回調的值细疚,就會發(fā)生exc_bad_access
原因:
當hook回調之前已經執(zhí)行了該控制器的dealloc沐绒,那此時hook的對象已經被釋放了俩莽;
查看了Aspects的源碼,block回調的參數(shù)就是AspectInfo類的乔遮,發(fā)現(xiàn)AspectInfo類中給instance成員使用unsafe_unretained聲明扮超,由于此特性在對象銷毀時,會依然指向之前的內存空間(野指針),不像__weak會在釋放時置為nil蹋肮;
最終導致收到回調時[data instance]的isa指針指向了已經釋放的內存空間出刷,因為此時hook的這個類對象已經被釋放了,所以[data instance]就會報壞內存訪問
解決方法:
不使用這個回調的值的就不會發(fā)生此問題坯辩,
或者修改自行修改框架馁龟,將instance特性由unsafe_unretained修改為__weak;
github上可以看到此框架3年前寫的漆魔,大神可能忽略了此問題或者其他問題坷檩,最好能給大神提個問題却音,看大神怎么說吧;