深度解析iPhone Category用法

2021-09-06 04:56:26 字數 1786 閱讀 3798

深度解析iphone category用法是本文要介紹的內容,在開發3.0的iphone靜態庫的時候,遇到了一些問題  。儘管我在應用程式鏈結的選項裡頭使用-objc的選項,我的程式在iphone上執行時還是crash了,而且經過定位之後發現,還是由庫中的category相關方法沒有被鏈入導致的;而程式在模擬器上執行卻是一點問題沒有,category的相關方法都能正確得到執行  。

那麼到底是什麼原因導致在真機上應用程式沒有將category方法鏈入呢?答案還是在上次提到的這個蘋果官方網頁  。該網頁下方的important裡頭提到,在64位及iphone os系統裡,由於編譯器的bug導致了-objc選項無法正常將靜態庫中的類的category的方法載入!也就是說,

假設你的類叫myclass,並且另外有個category叫myclass(extent),那麼如果你的應用程式鏈結你的庫,使用myclass(extent)中的方法,程式將會crash!要提的是,如果你的myclass(extent) 的實現是和myclass的實現是在同乙個實現體中,那麼該category的方法還是可以正常使用的,因為編譯的時候會一起被載入  。

那麼,假設你的庫已經使用了category,最後要使用放到真機上的時候發現,他crash了!那該怎麼辦呢?除了改**,還是有一些補救方法的  。

第一種,官方推薦的,但往往不是很好用的  。使用-all_load選項,這會導致所有的類的方法都會被載入,不管「你的程式」有沒有用到,所有的,包括系統的,方法會被載入  。這個方法不僅會導致你的目標程式大小增大,而且往往容易引起一些衝突,而這些衝突往往你無法解決(常常出現在你鏈結的各種庫中)  。或者你可以使用-force_load,這個你可以指定要載入所有方法的庫,這個算乙個還不錯的解決方法,但是僅在xcode3.2之後才支援,如果你必須支援低版本的sdk的話,那麼很悲劇,您這兩種方法都不大適用!(悲劇如我,就是這種情況)

第二種,你使用的category是你自己的類的category,這是個常見的情況,自己的乙個模擬較大,分拆成多個檔案時常用的手段  。經過一段時間的思考,發現這種情況的解救方法還是比較容易的,雖然個人認為有點不優雅,但是可以很簡單的解決掉  。

你可以將你所有的category的標頭檔案包含到類的主標頭檔案或者主實現檔案中,並且直接在你的類的主實現檔案中去import你的各個category的實現檔案  。這樣,編譯器在鏈入你的類的主方法時,你的各個category實現由於被import到你的類主實現檔案中,所以他可以找到你的category方法,並將該方法鏈入目標檔案  。當然,這個方法不太優雅就是了  。

第三種,就是你使用的是系統api某個類的category,比如你為uilabel增加了個category:uilabel(myextent).這個其實也很麻煩,剛開始也試了很多方法,網上的一些方法也試過,但是貌似還是不管用,最後換了個想法想,這個和自己類的category有什麼區別,貌似一樣沒區別阿  。所以最後試了一下,只要找乙個必定會使用的類,將category的標頭檔案和實現檔案import到該類的主實現檔案中,這樣編譯器就也能找到這些category方法了  。雖然一樣解決了問題,還是那句話,一點都不優雅!

雖然最後終於都解決了這些問題,得出的結論還是,不要輕易在iphone3.0及3.0以上的靜態庫中使用分檔案的category方法  。但2.0的sdk編譯的試驗過無問題  。

最後的吐槽是:category作為乙個objective-c最特色的語法功能之一,居然無法正常的在靜態庫中使用,蘋果你不覺得你很過分嗎!這麼嚴重的bug也不修復!你難道逼我寫個1000行左右的類嗎?有些類由於某些原因(不一定是技術原因)是不允許分拆成不同的類名!

Const 深度解析

物件導向是c 的重要特性.但是c 在c的基礎上新增加的幾點優化也是很耀眼的 就const直接可以取代c中的 define 以下幾點很重要,學不好後果也也很嚴重 1.const常量,如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安...

extern深度解析

c語言中extern用法 對於全域性變數來說,extern關鍵字可以在乙個模組中使用在另乙個模組中定義的全域性變數.只要extern宣告一下就好,但是變數只能定義一次,不然鏈結的時候會報錯.現代 編譯器一般採用按檔案編譯的方式,因此在編譯時,各個檔案中定義的 全域性變數 是互相不透明的。也就是說,在...

cin深度解析

cin cin.get,cin.getline等函式深入分析 很多初學者都認為cin函式是乙個很簡單的函式,其實不然!cin函式有很多需要了解的知識 比如 cin的返回值是什麼,cin提供了哪些成員函式且分別是什麼作用,如cin.clear cin.ignore cin.fail cin.good ...