自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度解析iPhone Category用法

移動(dòng)開發(fā) iOS
本文介紹的是深度解析iPhone Category用法,假設(shè)你的庫(kù)已經(jīng)使用了Category,最后要使用放到真機(jī)上的時(shí)候發(fā)現(xiàn),他Crash了。怎么辦?先來看內(nèi)容如何解決。

深度解析iPhone Category用法是本文要介紹的內(nèi)容,在開發(fā)3.0的iPhone靜態(tài)庫(kù)的時(shí)候,遇到了一些問題。盡管我在應(yīng)用程序鏈接的選項(xiàng)里頭使用-ObjC的選項(xiàng),我的程序在iPhone上運(yùn)行時(shí)還是Crash了,而且經(jīng)過定位之后發(fā)現(xiàn),還是由庫(kù)中的Category相關(guān)方法沒有被鏈入導(dǎo)致的;而程序在模擬器上運(yùn)行卻是一點(diǎn)問題沒有,Category的相關(guān)方法都能正確得到執(zhí)行。

那么到底是什么原因?qū)е略谡鏅C(jī)上應(yīng)用程序沒有將Category方法鏈入呢?答案還是在上次提到的這個(gè)蘋果官方網(wǎng)頁(yè)。該網(wǎng)頁(yè)下方的IMPORTANT里頭提到,在64位及iPhone OS系統(tǒng)里,由于編譯器的Bug導(dǎo)致了-ObjC選項(xiàng)無(wú)法正常將靜態(tài)庫(kù)中的類的Category的方法載入!也就是說,

假設(shè)你的類叫MyClass,并且另外有個(gè)Category叫MyClass(Extent),那么如果你的應(yīng)用程序鏈接你的庫(kù),使用MyClass(Extent)中的方法,程序?qū)?huì)Crash!要提的是,如果你的MyClass(Extent) 的實(shí)現(xiàn)是和MyClass的實(shí)現(xiàn)是在同一個(gè)實(shí)現(xiàn)體中,那么該Category的方法還是可以正常使用的,因?yàn)榫幾g的時(shí)候會(huì)一起被載入。

那么,假設(shè)你的庫(kù)已經(jīng)使用了Category,最后要使用放到真機(jī)上的時(shí)候發(fā)現(xiàn),他Crash了!那該怎么辦呢?除了改代碼,還是有一些補(bǔ)救方法的。

第一種,官方推薦的,但往往不是很好用的。使用-all_load選項(xiàng),這會(huì)導(dǎo)致所有的類的方法都會(huì)被載入,不管“你的程序”有沒有用到,所有的,包括系統(tǒng)的,方法會(huì)被載入。這個(gè)方法不僅會(huì)導(dǎo)致你的目標(biāo)程序大小增大,而且往往容易引起一些沖突,而這些沖突往往你無(wú)法解決(常常出現(xiàn)在你鏈接的各種庫(kù)中)?;蛘吣憧梢允褂?force_load,這個(gè)你可以指定要載入所有方法的庫(kù),這個(gè)算一個(gè)還不錯(cuò)的解決方法,但是僅在Xcode3.2之后才支持,如果你必須支持低版本的SDK的話,那么很悲劇,您這兩種方法都不大適用!(悲劇如我,就是這種情況)

第二種,你使用的Category是你自己的類的Category,這是個(gè)常見的情況,自己的一個(gè)類比較大,分拆成多個(gè)文件時(shí)常用的手段。經(jīng)過一段時(shí)間的思考,發(fā)現(xiàn)這種情況的解救方法還是比較容易的,雖然個(gè)人認(rèn)為有點(diǎn)不優(yōu)雅,但是可以很簡(jiǎn)單的解決掉。

你可以將你所有的Category的頭文件包含到類的主頭文件或者主實(shí)現(xiàn)文件中,并且直接在你的類的主實(shí)現(xiàn)文件中去import你的各個(gè)Category的實(shí)現(xiàn)文件。這樣,編譯器在鏈入你的類的主方法時(shí),你的各個(gè)Category實(shí)現(xiàn)由于被import到你的類主實(shí)現(xiàn)文件中,所以他可以找到你的Category方法,并將該方法鏈入目標(biāo)文件。當(dāng)然,這個(gè)方法不太優(yōu)雅就是了。

第三種,就是你使用的是系統(tǒng)API某個(gè)類的Category,比如你為UILabel增加了個(gè)Category:UILabel(MyExtent).這個(gè)其實(shí)也很麻煩,剛開始也試了很多方法,網(wǎng)上的一些方法也試過,但是貌似還是不管用,最后換了個(gè)想法想,這個(gè)和自己類的Category有什么區(qū)別,貌似一樣沒區(qū)別阿。所以最后試了一下,只要找一個(gè)必定會(huì)使用的類,將Category的頭文件和實(shí)現(xiàn)文件import到該類的主實(shí)現(xiàn)文件中,這樣編譯器就也能找到這些Category方法了。雖然一樣解決了問題,還是那句話,一點(diǎn)都不優(yōu)雅!

雖然最后終于都解決了這些問題,得出的結(jié)論還是,不要輕易在iPhone3.0及3.0以上的靜態(tài)庫(kù)中使用分文件的Category方法。但2.0的SDK編譯的試驗(yàn)過無(wú)問題。

最后的吐槽是:Category作為一個(gè)Objective-C最特色的語(yǔ)法功能之一,居然無(wú)法正常的在靜態(tài)庫(kù)中使用,蘋果你不覺得你很過分嗎!這么嚴(yán)重的bug也不修復(fù)!你難道逼我寫個(gè)1000行左右的類嗎?有些類由于某些原因(不一定是技術(shù)原因)是不允許分拆成不同的類名!

小結(jié):深度解析iPhone Category用法的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-08-02 18:07:03

iPhone 內(nèi)省 Cocoa

2011-08-12 11:23:47

iPhone窗口視圖

2011-07-18 14:23:40

iPhone 多任務(wù)

2011-07-27 17:02:12

Xcode iPhone 單元測(cè)試

2011-06-07 17:16:47

iPhone 數(shù)據(jù)

2011-08-12 14:54:45

iPhone委托

2011-08-19 13:45:14

iPhone應(yīng)用iPhone OS數(shù)據(jù)

2011-07-29 14:55:25

iPhone開發(fā) 動(dòng)畫過渡

2011-08-11 17:00:33

iPhone數(shù)據(jù)庫(kù)SQLite

2011-07-26 14:07:29

iPhone 二維碼

2011-06-02 17:27:49

iphone 多線程

2011-08-02 17:14:41

iPhone應(yīng)用 UITableVie

2024-01-11 12:14:31

Async線程池任務(wù)

2010-07-13 13:49:43

Perl foreac

2011-08-15 11:37:20

iPhone開發(fā)Mask

2011-08-12 14:39:00

iPhoneSDK

2021-11-09 23:08:20

iPhone手機(jī)安卓

2023-03-27 08:12:40

源碼場(chǎng)景案例

2023-10-10 11:02:00

LSM Tree數(shù)據(jù)庫(kù)

2011-08-19 14:47:48

iPhoneiPhone4iPad
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)