1.OC語言本質
OC不是一門全新的語言,C語言的基礎上增加了一層最小的面向對象語法.
OC發明者:1986年,BradCox(布萊德·考克斯)在第一個純面向對象語言Smalltalk基礎上寫成了Objective-C語言。
2.C與OC在數據類型上的差異
C語言和OC語言數據類型上的變化:
OC新增了一些數據類型:
2.1 基本數據類型 : 布爾類型(BOOL) ;這種類型只有兩個取值,真和假?
2.2 指針類型 : 類(Class)和 id類型指針,這是NSObject *OC中的對象類型;是一種動態對象類型,萬能指針
2.3 Block類型 : 代碼塊數據類型
2.4 特殊類型 : 選擇器數據類型
> 注:動態類型
> 動態類型,說簡單點就是id類型.動態類型和靜態類型相對的.像內置的明確的基本數據類型都屬于靜態類型(int,NSString等).靜態類型在編譯的時候就能被識別出來.所以若是程序發生了類型不對應,編譯器就會發出警告. 而動態類型就編譯器編譯的時候是不能被識別的,要等到運行時(run time),即程序運行時才會根據語境來識別.所以這里面就有兩個概念要分清:編譯時和運行時.
類概念:類是用來描述對象的,它是一系列方法和屬性的集合.
Objective-C的類聲明和實現包括兩個部分:接口部分和實現部分.
3.流程控制語句對比
C語言中使用的流程控制語句OC中都可以應用
OC中多了增強for循環,又稱for-in循環
4.函數與方法對比
函數在文件中是平行的,沒有所屬權問題,所以可以出現在任何地方(不能嵌套定義!)
方法有其所屬,對象方法/類方法.
5.面向對象新增特性:繼承/封裝/多態
6.面向對象新增語法特性
屬性生成器---編譯器特性(@property,@synthesize)
分類(category)---便于給原類增加方法,及重寫方法
協議(protocol)----可以讓不同類之間共享方法
Foundation框架
7.新增異常處理
處理錯誤信息(比如程序調用一個不存在的文件,如果沒有異常處理,會出現閃退的狀況!)
格式:@try...@catch ...@finally
實例:
//創建對象dog
Dog ? *dog = [Dog new];
@try {//調用一個沒有實現的方法
[dog test];?
}
@catch (NSException*exception) {
NSLog(@"%@",exception.name);
}
@finally {
NSLog(@"繼續執行!\n");
}
8.#import和#include區別
#import已默認有條件編譯功能
9.NSLog 和printf區別
NSLog是Foundation框架??供的Objective-C日志輸出函數,與標準C中的printf函數類似,并可以格式化輸出
NSLog輸出的是對象(NSString類型的對象),printf輸出的是char *類型的字符串
NSLog輸出會自動換行,并且有時間戳和項目名稱.
10.如何設計一個類
定義類其實就是定義類中的成員(成員變量/成員方法),還有不要忘了類名
11.類中的消息機制:使用對象調用方法就是OC中的消息機制
消息機制與SEL:
想明白消息機制必須先知道動態綁定(dynamic binding).消息機制類似函數調用(編譯時,將函數簽名告訴編譯器就OK),所謂某對象調用某個方法,其實就是給對象發送一條消息.這時,動態綁定的特性就來了,OC可以先跳過編譯,到run time才動態添加方法調用,在運行時才決定要調什么方法,需要傳什么參數進去. 這就是動態綁定,要實現run time 時調用某個方法,就必須用SEL變量(有點類似函數指針)綁定一個方法. 最終通過調用該保存有某方法ID的SEL變量,實現方法的調用. 這是不是意味著@selector()會給某方法生成一個ID??
12.類方法的優勢和弊端
優勢:類名調用類方法時不需要創建對象,節省創建對象需要的時間/空間.
劣勢:由于不創建對象,也就意味著不能調用成員變量.
可見,類方法一般用于編寫工具類!
類方法和對象方法可以同名,這和函數很不同!!
13.對象的存儲細節
類創建對象,每個對象在內存中都占據一定的存儲空間,每個對象都有一份屬于自己的單獨的成員變量,所有的對象公用類的成員方法,方法在整個內存中只有一份,類本身在內存中占據一份存儲空間,類的方法存儲于此。
這么來看,方法和函數一樣也是占據空間的!--->是的,占空間,在類對象內!
isa指針和消息機制
每一個對象都包含一個isa指針.這個指針指向當前對象所屬的類。
[p eat];表示給p所指向的對象發送一條eat消息,調用對象的eat方法,此時對象會順著內部的isa指針找到存 儲于類中的方法,執行。
可見,@selector(method)將方法包裝成一個SEL類型的ID,實質就是整型. 而p對象通過其內的isa指針發送該消息給類對象,調用保存在其內的對象方法.
14.方法和函數
函數屬于整個文件,可以寫在文件中的任何位置,包括@implementation...@end中,但寫在 @interface...@end會無法識別,函數的聲明可以再main函數內部也可以在main函數外部。