2016-08-17 14:50:55 1638瀏覽
ARC可以簡(jiǎn)化代碼并增強(qiáng)應(yīng)用程序的穩(wěn)定性,它已經(jīng)成為今后蘋果iOS開發(fā)的必然趨勢(shì),越來(lái)越多的項(xiàng)目包括一些第三方庫(kù)都已經(jīng)采用了ARC。蘋果公司鼓勵(lì)開發(fā)者們使用ARC,AER已經(jīng)成為iOS開發(fā)工程師必備技術(shù)職能,但問(wèn)題并不在于程序員們不想使用ARC——如果0.C從一開始就使用ARC事情反倒好辦了,但事實(shí)并不是這樣。問(wèn)題在于,以前的代碼如何工作在ARC模式F,即非ARC代碼如何遷移到ARC?有些代碼,比如一些第三方的庫(kù),并不是一開始就支持ARC,而要將這些龐大的第三方庫(kù)都重構(gòu)為ARC代碼,仍然是一個(gè)長(zhǎng)期和富有挑戰(zhàn)性的工作。
因此,由于歷史的原因,“ARC”和“非ARC”代碼混用的情況仍將在一段時(shí)間內(nèi)繼續(xù)存在。代碼混用的情況一般分為以下兩種。
第一,非ARC項(xiàng)目重構(gòu)為ARC項(xiàng)目,其中有部分代碼保持非ARC。
例如,讀者手中有一些老的項(xiàng)目(非ARC),需要將它們重構(gòu)為ARC項(xiàng)目(使用Xcode的重構(gòu)refactoring功能),但其中又有部分代碼不能重構(gòu)(比如一些非ARC的第三方庫(kù),轉(zhuǎn)換起來(lái)比較麻煩或者會(huì)導(dǎo)致各種各樣莫名其妙的問(wèn)題)。
第二,在ARC項(xiàng)目中添加非ARC的代碼。
比如,有一個(gè)ARC的項(xiàng)目,讀者想導(dǎo)入一些非ARC的代碼到這個(gè)項(xiàng)目中,這些非ARC的代碼暫時(shí)不想轉(zhuǎn)換為ARC。
不論是上述哪一種情況,都需要項(xiàng)目能在混合模式下(“ARC”與“非ARC”代碼)運(yùn)行。
1、非ARC項(xiàng)目重構(gòu)為ARC項(xiàng)目,其中有部分代碼保持非ARC
(1)打開非ARC的項(xiàng)目。在aroject設(shè)置面板選擇target,在Build Settings中將“Compiler forC/C++/0biective—C”設(shè)為“Apple LLVM compiler 3.0”或以上。因?yàn)?/span>ARC只能用Clang進(jìn)行編譯。
(2)還是在Build Settings找到“Objective。C Automatic Reference Counting”,將值改成YES。此時(shí)如果編譯,編譯器會(huì)警告無(wú)數(shù)的錯(cuò)誤,暫時(shí)不用管它。
(3)單擊菜單“Edit—Refactor---Convert to Objective—C ARC”,在“Select Targets To Convert”界面選擇target,單擊目標(biāo)名旁邊的小箭頭,以展開文件列表。
(4)單擊右鍵或【ctrl+左鍵】選擇所有不想重構(gòu)的文件,如下圖所示。
(5)單擊【Precheck】按鈕進(jìn)行重構(gòu)。如果一切正常,則可以進(jìn)行編譯了。
在此列出一些在轉(zhuǎn)換時(shí)可能出現(xiàn)的問(wèn)題,當(dāng)然在使用ARC時(shí)也需要注意在代碼中避免這些問(wèn)題:
·Cast…requires a bridged cast...
ARC“免費(fèi)橋接”中出現(xiàn)的問(wèn)題。關(guān)于“免費(fèi)橋接”8.4節(jié)會(huì)進(jìn)行詳細(xì)介紹。
·Receiver type‘X’for instance message is a forward declaration…
前置聲明問(wèn)題。如果在ARC中調(diào)用某個(gè)子類的方法,而該方法是繼承自父類-中的方法(未進(jìn)行覆蓋),則必須導(dǎo)入父類的頭文件,否則無(wú)法編譯。
·Switch case is in protected scope…
現(xiàn)在switch語(yǔ)句必須加上{}了,ARC需要知道局部變量的作用域,加上{J后switch語(yǔ)法更加嚴(yán)格,否則遇到?jīng)]有break的分支的話內(nèi)存管理會(huì)出現(xiàn)問(wèn)題。
·A name is referenced outside the NSAutoreleasePool scope that it was declared in…
在非ARC代碼中使用了autoreleasepool,轉(zhuǎn)換為ARC代碼中則變?yōu)?/span>@autoreleasepool塊,但原來(lái)pool中聲明的變量在新的@autoreIeaseDool塊中作用域?qū)⒈幌拗茷榫植?。將變量聲明?/span>pool之外即可。
·ARC forbids Objective—C objects in structs or unions…
ARC禁止在C結(jié)構(gòu)體中放入0一C對(duì)象。ARC對(duì)于結(jié)構(gòu)體和0一C對(duì)象指針采用完全不同的處理方式。因?yàn)榫幾g器根本不知道一個(gè)結(jié)構(gòu)體何時(shí)被copy、何時(shí)被destroy,也找不到地方去插入retain和release語(yǔ)句,而且將對(duì)象指針?lè)诺浇Y(jié)構(gòu)中也不是很常見的行為,所以ARC完全放棄了對(duì)結(jié)構(gòu)體的管理。如果程序員想將0.c對(duì)象指針?lè)诺浇Y(jié)構(gòu)體中,必須用unsafe unretained進(jìn)行修飾,并自己負(fù)責(zé)對(duì)該對(duì)象的內(nèi)存管理以及解決因此產(chǎn)生的一。切問(wèn)題。切記,通常不應(yīng)該把O—C指針?lè)湃虢Y(jié)構(gòu)體中,如果非要這樣做,最好將結(jié)構(gòu)體改變?yōu)檩p量級(jí)的OC類。
2、在ARC項(xiàng)目中添加非ARC的代碼
打開ARC項(xiàng)目,轉(zhuǎn)到target的“Build Phases”窗口。
將某個(gè).m文件(不想ARC的)的compiler flags標(biāo)志修改為-fno-obj-arc(單擊該文件旁邊的compiler flags欄,然后輸入.fno.objc.arc)。這個(gè)標(biāo)志將顯示在文件右邊,如下圖所示。
這樣,編譯器就會(huì)知道凡是帶有這個(gè)標(biāo)志的文件都不需要ARC編譯。
查看更多關(guān)于“iOS培訓(xùn)資訊”的相關(guān)文章>>