1-OC與C的語法區別

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函數外部。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • 前言:面試筆試都是必考語法知識點。請認真復習和深入研究OC。 目錄:iOS-面試題-OC基礎篇 (1) - (84...
    麥穗0615閱讀 4,271評論 0 33
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,364評論 0 6
  • 2、#import和#include的區別是什么?#import<> 跟 #import""有什么區別? .#im...
    AlanGe閱讀 337評論 0 0
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,759評論 0 4