RunTime
Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時(shí)期做的事放到了運(yùn)行時(shí)來處理。這種動態(tài)語言的優(yōu)勢在于:我們寫代碼時(shí)更具靈活性,如我們可以把消息轉(zhuǎn)發(fā)給我們想要的對象,或者隨意交換一個方法的實(shí)現(xiàn)等。
這種特性意味著Objective-C不僅需要一個編譯器,還需要一個運(yùn)行時(shí)系統(tǒng)來執(zhí)行編譯的代碼。對于Objective-C來說,這個運(yùn)行時(shí)系統(tǒng)就像一個操作系統(tǒng)一樣:它讓所有的工作可以正常的運(yùn)行。這個運(yùn)行時(shí)系統(tǒng)即Objc Runtime。Objc Runtime其實(shí)是一個Runtime庫,它基本上是用C和匯編寫的,這個庫使得C語言有了面向?qū)ο蟮哪芰Α?/p>
所謂運(yùn)行時(shí),也就是在編譯時(shí)是不存在的,只是在運(yùn)行過程中才去確定對象的類型、方法等。利用Runtime機(jī)制可以在程序運(yùn)行時(shí)動態(tài)修改類、對象中的所有屬性、方法等。
在使用運(yùn)行時(shí)的地方,都需要包含頭文件:#import<objc/runtime.h>
1、Category增加屬性
2、NSCoding的自動歸檔和自動解檔
3、字典和模型的自動轉(zhuǎn)換
4、系統(tǒng)自帶方法動態(tài)重寫
5、獲取類的所有成員變量的類型和名稱
6、動態(tài)地創(chuàng)建一個類(KVO的底層實(shí)現(xiàn))
【Objective-C】垃圾回收機(jī)制和ARC
ARC:自動引用計(jì)數(shù)(automatic reference counting),當(dāng)你在編譯程序時(shí)提供自動管理內(nèi)存的功能,它會為程序自動加入內(nèi)存的控制Retain/Release,底層機(jī)制依舊是引用計(jì)數(shù)對內(nèi)存進(jìn)行管理。
垃圾回收:objective-c 2.0引入了自動內(nèi)存管理機(jī)制,也被稱為垃圾回收。垃圾回收功能只支持OS X應(yīng)用開發(fā),無法用在iOS應(yīng)用程序上。因此iOS程序是要管理內(nèi)存的,ARC不是自動內(nèi)存管理,只是在編譯的時(shí)候適當(dāng)插入Retain/Release.
屬性修飾
atomic:原子操作,加了原子鎖,是Setter/Getter兩個函數(shù)的原語操作,相當(dāng)于在函數(shù)首尾加上了鎖,當(dāng)多個線程操作Setter/Getter函數(shù)時(shí),一個線程執(zhí)行完畢之前,不會出現(xiàn)另一個線程執(zhí)行的情況,這樣可以保證線程安全,默認(rèn)是atomic
nonatomic:非原子操作,單線程使用這個,因?yàn)樾时容^高,多線程會有可能線程不安全。
readonly:只會生成Getter方法,不會生成Setter方法
readwrite:生成Getter和Setter方法
copy:復(fù)制一個對象并創(chuàng)建strong關(guān)聯(lián),引用計(jì)數(shù)為1 ,原來對象計(jì)數(shù)不變,修飾NSString時(shí)為深復(fù)制,內(nèi)容拷貝。可用來修飾block,將block移到堆里面,使得block被聲明的作用域被銷毀仍可繼續(xù)使用
strong(Retain):對原對象引用計(jì)數(shù)加1。指針拷貝,修飾NSString時(shí)為淺復(fù)制。
assign:對指針賦值,不涉及引用計(jì)數(shù)的變化,弱引用。對象不能使用assign,數(shù)據(jù)類型(BOOL、int、float)使用
weak:修飾基礎(chǔ)類型外的NSObject和其他子類,比assign多了一個功能,對象釋放后把指針置為nil,避免了野指針。assigin 可以用非 OC 對象,而 weak 必須用于 OC 對象。
變量修飾
_ _strong:是缺省的關(guān)鍵詞,強(qiáng)引用。
_ _weak:聲明了一個可以自動置nil的弱引用(ARC中)。
_ _unsafe_unretained:聲明一個弱引用,但是不會自動nil化(只有iOS 4 才應(yīng)該使用)。
_ _autoreleasing:用來修飾一個函數(shù)的參數(shù),這個參數(shù)會在函數(shù)返回的時(shí)候被自動釋放(類似autorelease)。
iOS常用模式
1、MVC
2、代理模式:Delegate
3、觀察者模式:只發(fā)布消息,不關(guān)心誰接收,NotificationCenter,KVO
4、單例模式:[NSUserDefaults standardUserDefaults]
5、裝飾器模式:裝飾器模式在不修改原來代碼的情況下動態(tài)的給對象(而不是類)增加新的行為和職責(zé),Category
6、工廠模式:類方法,[NSNumber numberWithBool];