Google Admob for iOS SDK中靜態庫在加載過程中,如果不在Build Settings中添加other link flag 為 -ObjC,就會出現程序一運行就崩潰的情況。添加後,程序運行正常,後來,在網上查找了資料:
以下內容,來自查詢到的資料,可以有助於理解出現這種問題的原因,後續再仔細體會。
今天編譯項目的時候發現拋出了一個異常,<NSInvalidArgumentException>+[NSInvocation invocationWithMethodSignature:]: method signature argumentcannot be nil。但是看到項目裡面是有這個類的,最後思考了下,由於是使用的runtime的調用,沒有在頭文件中import,所以link的時候是找不到這個類的,在網上看了下,只需要在other linker flag中添加-Objc就可以,添加之後發現正確了,不過感覺還是需要了解下這個編譯選項的含義,於是在網絡上查了下,最後找個一個英文的解釋。
-all_load Loads all members of static archive libraries.
-ObjC Loads all members of static archive libraries that implement an Objective-C class or category.
-force_load (path_to_archive) Loads all members of the specified static archive library. Note: -all_load forces all members of all archives to be loaded. This option allows you to target a specific archive.
翻譯過來就是-all_load就是會加載靜態庫文件中的所有成員,-ObjC就是會加載靜態庫文件中實現一個類或者分類的所有成員,-force_load(包的路徑)就是會加載指定路徑的靜態庫文件中的所有成員。所以對於使用runtime時候的反射調用的方法應該使用這三個中的一個進行link,以保證所有的類都可以加載到內存中供程序動態調用。