oc 裡的匿名對象
oc 這裡,很少用到,因為并不适用于oc的記憶體管理,隻是面試筆試也許出現,要求能看懂,不要在項目裡這樣寫,因為寫匿名對象,會造成記憶體洩露


能看懂什麼意思就行
成員變量都以下劃線 _ 開頭
可以跟get方法的名稱區分開
可以跟其他局部變量區分開,一看到下劃線開頭的變量,肯定是類的成員變量
1、oc是動态檢測錯誤,oc裡調用一個沒有聲明也沒有實作的對象方法,則不會編譯報錯而是警告,連結也能通過,隻有運作才檢測出錯
2、oc裡調用隻有聲明,但是沒有實作的對象方法,這編譯也是警告,連結通過,運作才出錯
3、oc調用隻有實作(沒聲明)的方法,則沒有問題!因為運作時才檢測程式的問題,聲明其實隻是擺設,删掉是沒事的。隻不過開發中,必須規範!該寫都要寫上。即使不報錯。
直接可以用類名來執行的方法(類本身會在記憶體中占據存儲空間,裡面有類\對象方法清單)
1. 類方法和對象方法對比
1) 對象方法
減号-開頭
隻能讓對象調用,沒有對象,這個方法根本不可能被執行
對象方法能通路執行個體變量(成員變量)
2) 類方法
加号+開頭
隻能用類名調用,對象不能調用
類方法中不能通路執行個體變量(成員變量)
使用場合:當不需要通路成員變量的時候,盡量用類方法
3) 類方法和對象方法可以同名
4) 提高程式性能
類方法的好處和使用場合:不依賴于對象,執行效率高, 能用類方法,盡量用類方法
self 關鍵字用來指明對象是目前方法的接收者。
當成員變量和局部變量同名時,采取就近原則,通路的是局部變量
用self通路成員變量,區分同名的局部變量
細節:
1) 出現的地方:可以出現在所有的oc方法中(對象方法\類方法),但是不能出現在函數裡
2) 作用:
使用 "self->成員變量名" 通路目前方法調用的成員變量
使用 "[self 方法名];" 來調用方法(對象方法\類方法)


低級錯誤:
用self去調用函數
類方法中用self調用對象方法,對象方法中用self調用類方法
self死循環


原則上(如果不使用 arc,也就是自動引用計數),那麼
建立一個新對象,都要請求配置設定記憶體,在完成對該對象的操作時,必須釋放其所用的記憶體空間。類似 c++的記憶體管理。
與 c 語言相容的地方:
預處理:
#define 語句和 c 一樣
#運算符: #define str(x) #x
表示在調用該宏時,預處理程式根據宏參數建立c 風格的常量字元串。
例如:str("hello")将産生"\"hello"\"
##運算符: 表示用于把兩個标記連在一起
#import 語句;相當于#include 語句,但是 #import 可自動防止同一個檔案被導入多次。
#條件編譯語句(#ifdef 、#endif 、 #else 、 #ifndef)和 c 一樣
#undef 語句 消除特定名稱的定義
其他基本的c 語言特性:
數組、函數、指針、結構、聯合的用法和c 一樣。
compound literal 是包含在括号之内的類型名稱,之後是一個初始化清單。
例如
如果 intptr 為 int * 類型:
intptr = (int[100]){[0] = 1, [50] = 50, [99] = 99};
如果數組大小沒有說明,則有初始化清單确定。
其他如循環語句 (do while、while、for) 、條件語句(if 語句(if-else、複合判斷條件等) 、switch 語句)、 boolean(yes no)、條件運算符、goto 語句、空語句、逗号表達式、sizeof 運算符、指令行參數、位操作都 和 c 一樣 。
oc 的繼承
oc的繼承隻支援單一繼承,和java類似,也就是兒子隻能有一個爸爸,但是
可以通過 objective-c 的分類和協定特性擷取多繼承的優點
而c++支援單一和多重繼承。
好處:
不改變原來模型的基礎上,拓充方法
建立了類與類之間的聯系
抽取了公共代碼
壞處:
耦合性強
基本上所有類的根類是nsobject類
如圖:
animal類擁有nsobject類的new方法,子類dog和cat同時擁有前兩層類的所有方法和屬性。類似 c++和 java


oc 繼承裡的細節(類似其他面向對象語言)
父類必須聲明在子類的前面
子類和父類不能有相同的成員變量,但是方法可以重寫
方法的重寫問題:子類重新實作父類中的某個方法,也就是覆寫了父法
調用某個方法時,優先去目前類中找,如果找不到,去父類中找
這是内部原理。
每個對象都有一個isa指針,指向對象屬于的類,且記住:每個類裡(oc的)都有一個superclass指針,指向自己的父類。
這樣通過對象就能找到對象屬于的類,也能找到類的父類。而這些指針就在nssobject類裡。
記憶體結構:
繼承的使用場合
1> 當兩個類擁有相同屬性和方法的時候,就可以将相同的東西抽取到一個父類中
2> 當a類完全擁有b類中的部分屬性和方法時,可以考慮讓b類繼承a類
// 繼承:xx 是 xxx
// 組合(也叫聚合關系):xxx 擁有 xxx
super關鍵字
實作重寫之後,還可以調用父類的對象方法和類方法,super的作用;直接調用父類中的某個方法
1、super處在對象方法中,那麼就會調用父類的對象方法
2、super處在類方法中,那麼就會調用父類的類方法
使用場合:
子類重寫父類的方法時想保留父類的一些行為。
在oc裡,簡單的多,調用某方法,先是在所在類就近找,找不到去父類找。太簡單了。如果重寫了父類方法,那麼隻能調用子類重寫的這個方法了,如果想保留父類原方法定義的功能,可以用super。
oc 的多态
多态的展現
person *p = [student new];
p->age = 100;
[p walk];
子類對象指派給父類指針,父類指針通路對應的子類的繼承來的屬性和方法
多态的局限性
不能通路子類的特有的屬性或方法(可以考慮強制轉換)
多态的細節
動态綁定:在運作時根據對象的類型确定動态調用的方法
注意點:
1.沒有繼承就沒有多态
2.代碼的展現:父類類型的指針指向子類對象
3.好處:如果函數\方法參數中使用的是父類類型,可以傳入父類、或者子類對象
4.局限性:父類類型的變量 不能 直接調用子類特有的方法。必須強轉為子類類型變量後,才能直接調用子類特有的方法(類似c++的指派相容)


多态的局限性:
父類類型的變量 不能 直接 調用子類特有的方法。
聯系c++
c++是使用了虛函數,(包括純虛函數和抽象類)對公有繼承的子類的方法,重寫虛函數,父類指針或者引用指向子類,那麼就能調用子類的重寫虛函數,指向父類,就是調用父類的虛函數,實作動态聯編。
oc裡,沒有那麼複雜,就是直接子類繼承父類,那麼重寫父類某個對象方法,這隻需要父類指針指向子類對象,那麼就調用子類的重寫方法,同樣也不能調用子類特有的方法。
由此斷定,oc的方法都是虛方法!不用和c++一樣用virtual聲明!且oc的重寫也是多态的一種,oc裡所有的方法通路屬性都是公有的!而類成員變量預設是保護的。和c++有些差別,c++是預設都是私有的。
再看oc的弱文法!比如把子類對象指針指向父類
c++裡肯定錯誤,但oc裡沒問題,隻警告,但這樣不好,不推薦。完全沒道理。
再看:
動物怎麼了成了字元串對象了?oc裡xcode不報錯!但是絕對是不對,不規範。還有,同一個層次的類,貓類指針指向狗類對象,調用eat方法,在oc的弱文法下,還是沒問題的,調狗的eat。
oc太弱了!但是在c++裡直接就報錯了。不可以這樣寫,即使編譯器不報錯。
多态的好處
用父類對象接收參數,方法或者函數,即可以接受子類對象,也能接受父類對象,節省代碼。否則還要分開寫多個方法或者函數。
充分展現面向對象的抽象和具體,通過子類重寫繼承來的父類的虛方法(oc預設都是),通過父類指針指向子類對象,實作動态多态性!不看指針的類型,而是看指針指向的哪個對象類型,就調用哪個子類對象的虛方法。注意子類特有的方法不可以,必須強轉。
辛苦的勞動,轉載請注明出處,謝謝……
http://www.cnblogs.com/kubixuesheng/p/4311257.html