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