1. Objective C語言使用的是"消息結構"而非"函數調用"。 "消息結構"和"函數調用"之間的區別 "消息結構"的語言: 運行時由運行環境決定所應執行的代碼 "函數調用"的語言: 由編譯器決定 記憶體模型:Objective C語言中的指針是用來指示對象的。 Objective C為C語言添 ...
Objective-C語言使用的是"消息結構"而非"函數調用"
"消息結構"和"函數調用"之間的區別
"消息結構"的語言: 運行時由運行環境決定所應執行的代碼
"函數調用"的語言: 由編譯器決定
//Messaging (Objective-C) 消息結構
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter2];
//Function calling (C++)方法調用
Object *obj = new Object;
obj->perform(parameter1,parameter2);
記憶體模型:Objective-C語言中的指針是用來指示對象的
Objective-C為C語言添加了面向對象特性,是其"超集",C語言的所有功能在編寫OC代碼時依然適用!
Objective-C語言中的指針是用來指示對象的。
對象所占記憶體總是分配在"堆空間"(heap space)中,不能在棧(stack)中分配對象。
NSString *someString = @"the string";
/**說明:
上面代碼是聲明一個名為someString的變數,類型是NSString *。看就是說,此變數為指向NSString的指針。
Objective-C對象所占記憶體分配在“堆空間”中,絕對不會分配在“棧”上。
所以someString變數指向分配在堆里的某塊記憶體,其中含有一個NSString對象。
*/
//再創建一個變數,令其指向同一地址,那麼並不拷貝對象,只是這兩個變數會同時指向此對象
NSString *anotherString = someString;
/**說明:
兩個NSString *類型變數指向一個NSString實例。
當前“棧幀”里分配兩塊記憶體,每塊記憶體大小都能容下一枚指針。(在32位架構電腦是4位元組,64位架構電腦是8位元組)。這兩塊記憶體里的值都一樣,都是NSString實例的記憶體地址。
*/
分配在堆中的記憶體必須直接管理,Objective-C是通過"引用計數"這一記憶體管理架構來管理,而分配在棧上用於保存變數的記憶體則會在其棧幀彈出時自動清理。
- Objective-C定義的不含*的變數通常是非對象類型的變數(基本數據類型和結構體)。他們使用的是"棧空間"(stack space)
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
要點
Objective-C為C語言添加了面向對象特性,是其超集。
Objective-C使用動態綁定的消息結構,也就是說,在運行時才會檢查對象類型。
接受一條消息之後,究竟應執行何種代碼,由運行期環境而非編譯器來決定。