GeekBand-OC第一周學(xué)習(xí)筆記

由于時間有限,所以寫的比較粗糙,也沒有特別深入的地方,只是一點點心得體會,作為初學(xué)者,如果不準確或不精確的地方歡迎大家留言指導(dǎo)!??!

一、編譯器

? OC是在C語言的基礎(chǔ)上發(fā)展起來的,了解了OC的編譯器,偷下懶放3個鏈接。

LLVM、gcc、clang

二、內(nèi)存管理模型

? clang命令有一個參數(shù)為fobjc-arc,大家都了解到arc是引用計數(shù)的方式進行內(nèi)存對象的釋放的。

? 大致了解了下OC的內(nèi)存管理模型,OC三種內(nèi)存管理模式(抄來的,下面有原文)

1.MRC:ManualRetain-Release手動持有釋放,OC本身的引用計數(shù)alloc/new/copy/mutablecopyrelease/autorelease。

2.ARC:Automatic Reference Counting自動引用計數(shù):

Xcode的ProjectSetting中,設(shè)置Objective-C AutomaticReference Counting為YES; Xcode 4.2+,新的Project默認為ARC

3.GC:GarbageCollection垃圾回收,MAC-OS支持,IOS不支持。

http://blog.csdn.net/blues1021/article/details/44247299

http://my.oschina.net/wealpan/blog/182720

三、引用類型與值類型

引用類型的*,這個對于java程序員來說是超級不習(xí)慣的。

不過這也能提醒我們該對象位于堆上還是棧上,堆棧對象的生命周期的不同也影響著我們代碼的編寫。

與java不同的是,值類型除了基本數(shù)據(jù)類型外,還有結(jié)構(gòu)struct及枚舉enum。

四、類

和java不同,一個類是有兩部分構(gòu)成的:頭文件、實現(xiàn)文件。

頭文件只負責(zé)定義功能,實現(xiàn)文件負責(zé)實現(xiàn)具體功能的,

類的成員分兩種:數(shù)據(jù)成員、函數(shù)成員

? 1、數(shù)據(jù)成員:屬性、實例變量。

? ? 值得注意的有幾點:

? 首先,OC中是沒有傳統(tǒng)意義上的私有變量的,如果需要實現(xiàn)“私有變量”功能,我們可以只在實現(xiàn)中定義而不在接口中定義。

? 其次,屬性默認會被編譯器自動生成實例變量及getter、setter方法,如有需求不想讓屬性有對外的setter方法,可以在屬性上加readonly描述特性。

? 再次,由于OC程序大多數(shù)采用ARC進行自動釋放引用類型對象,所以O(shè)C中有了week描述特性,被week描述特性設(shè)置的屬性引用的對象,將不會被本次引用增加計數(shù),以避免循環(huán)引用的問題。

? 還有,一個比較重要的描述特性是copy,這個是非常實用的描述特性,可以用來“斷開連接”。

? 當(dāng)然,還有一些描述特性需要我們了解,atomic(原子性,推測應(yīng)該是影響線程安全的屬性)等等。。。

? 2、函數(shù)成員:方法、初始化器、析構(gòu)器

? 方法分為實例方法、類方法,需要注意的是類方法不能訪問實例成員。以本人的理解就是類方法就是靜態(tài)方法,沒有類屬性(可以借助C的方式),所以類方法是隨著類的加載加載到內(nèi)存當(dāng)中的,而實例方法及屬性是在實例的初始化中加載到內(nèi)存中的,所以類方法不可以訪問實例方法及屬性。

? self在實例方法及類方法中也是不同的,self在實例方法中為實例對象,類方法中應(yīng)該是類對象本身。

? 和數(shù)據(jù)成員類似,沒有私有方法,當(dāng)然也有各種各樣的辦法實現(xiàn)私有化,這里就不再深入。

? 有一點比較不同的是方法的調(diào)用,動態(tài)消息分發(fā)的方式:[class/object method];

? 外部參數(shù)名也是比較有特點的地方,這讓我們的代碼可讀性更高,更加符合敏捷性代碼開發(fā)的特點。

? 動態(tài)方法調(diào)用機制是OC中比較消耗性能的地方,具體這里也不過于深入研究啦。

五、初始化器、析構(gòu)器

? 對象初始化器和java中的構(gòu)造器有點類似,而類初始化器和java中的靜態(tài)代碼塊也有神似的地方,不過類初始化器只能有一個,而獨享初始化器可以有多個。

? 值得注意的一點是,對象初始化器返回的對象可以不是該類的實例哦,至于作用我想可能可以用在工廠或者代理模式中。

? 析構(gòu)器是在對象被銷毀時調(diào)用的,切不可收到調(diào)用,主要作用是可以在這里釋放資源,值得一提的是,析構(gòu)器會自動后置調(diào)用父類的析構(gòu)器。

? 六、繼承、多態(tài)

? 這讓我想起面向?qū)ο笤O(shè)計的六大原則

http://www.cnblogs.com/cavingdeep/archive/2004/10/28/208956.html

? 這些都是面向?qū)ο笳Z言的特性,相信很多有面向?qū)ο蠼?jīng)驗的同學(xué)都很好理解。

? 但是有一個特點是這樣的:

? 有一個父類A,兩個其子類B、C,(或者共同的父類是NSObject)

? 在實例化對象時,我們可以這樣做

? A *a = [[C alloc] init];

? 這個可以理解?

? 但是我們也可以這樣寫

? B *b = [[C alloc] init];

? 雖然會有警告,但是是可以編譯通過的,但是b不可以調(diào)用C中定義,但是B中未定義的方法或?qū)傩裕ň幾g不通過),b也不可以調(diào)用C中未定義,但是B中定義的方法方法或?qū)傩裕ㄟ\行異常)。

? 如果不違反以上兩個條件,程序是不會拋出異常的。


后來大致理解了下,查到如下博客,希望對大家有所幫助。

http://www.bubuko.com/infodetail-1099797.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容