由于時間有限,所以寫的比較粗糙,也沒有特別深入的地方,只是一點點心得體會,作為初學(xué)者,如果不準確或不精確的地方歡迎大家留言指導(dǎo)!??!
一、編譯器
? OC是在C語言的基礎(chǔ)上發(fā)展起來的,了解了OC的編譯器,偷下懶放3個鏈接。
二、內(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ū)傩裕ㄟ\行異常)。
? 如果不違反以上兩個條件,程序是不會拋出異常的。
后來大致理解了下,查到如下博客,希望對大家有所幫助。