集成三方框架的時(shí)候出現(xiàn)了些問題茧彤,查了查資料,了解下報(bào)錯原因及解決方法帆离,稍微總結(jié)下蟆沫。
問題:
集成微信支付的時(shí)候崩潰
-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x174253050
原因:
在集成微信支付時(shí)兰珍,文件夾中包含一個(gè).a文件捶牢。.a文件是一個(gè)靜態(tài)庫崖叫,鏈接器只會鏈接類的符號欣范,并不會鏈接方法的符號变泄。所以當(dāng)調(diào)用[_NSArrayM enqueue:]方法時(shí),鏈接器會從Foundation Framework中找到類符號定義并將該庫鏈接進(jìn)來恼琼,而enqueue方法是_NSArrayM擴(kuò)展(category)的方法妨蛹,編譯器無法鏈接方法的符號,導(dǎo)致找不到該方法晴竞,所以報(bào)錯蛙卤。解決這個(gè)問題的方法關(guān)鍵就是把靜態(tài)庫中的相關(guān)文件都加在進(jìn)來。
解決方法:
官方文檔給的解決方法 方法:Target->Build Settings->Linking 下 Other Linker Flags 項(xiàng)添加-Objc -all_load
添加的字段作用:
-ObjC:鏈接器會把 Objective-C 的類和分類的所有對象文件全部鏈接噩死,全部鏈接后方法符號全部被鏈接進(jìn)來颤难,如果類庫中只有category沒有類的時(shí)候這些category還是加載不進(jìn)來。變通方法就是加入-all_load或者-force_load已维。
-all_load:鏈接器把全部的對象文件都鏈接進(jìn)來行嗤。
-force_load:鏈接器把你指定的靜態(tài)鏈接庫中的全部對象文件鏈接進(jìn)來,后面要跟需要加載的靜態(tài)庫的路徑垛耳。
另:
添加-ObjC -all_load字段后栅屏,微信支付運(yùn)行不再報(bào)錯飘千,但是引用的其他第三方庫運(yùn)行時(shí)報(bào)錯,兩個(gè)庫可能哪里有什么沖突之類既琴,使用-force_load后解決了問題占婉。用到什么就加載什么,這種感覺更好甫恩。