52個有效方法(1) - 瞭解Objective-C語言的起源

Objective-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語言中的指針是用來指示對象的。spa

  • 對象所佔內存老是分配在"堆空間"(heap space)中,不能在棧(stack)中分配對象。3d

NSString *someString = @"the string";
/**說明:
上面代碼是聲明一個名爲someString的變量,類型是NSString *。看就是說,此變量爲指向NSString的指針。
Objective-C對象所佔內存分配在「堆空間」中,絕對不會分配在「棧」上。
因此someString變量指向分配在堆裏的某塊內存,其中含有一個NSString對象。
*/
//再建立一個變量,令其指向同一地址,那麼並不拷貝對象,只是這兩個變量會同時指向此對象
NSString *anotherString = someString;

/**說明:
兩個NSString *類型變量指向一個NSString實例。
當前「棧幀」裏分配兩塊內存,每塊內存大小都能容下一枚指針。(在32位架構計算機是4字節,64位架構計算機是8字節)。這兩塊內存裏的值都同樣,都是NSString實例的內存地址。
*/

兩個變量指向同一NSString實例的內存地址

  • 分配在堆中的內存必須直接管理,Objective-C是經過"引用計數"這一內存管理架構來管理,而分配在棧上用於保存變量的內存則會在其棧幀彈出時自動清理。指針

  • Objective-C定義的不含*的變量一般是非對象類型的變量(基本數據類型和結構體)。他們使用的是"棧空間"(stack space)
struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CGRect CGRect;

要點

  • Objective-C爲C語言添加了面向對象特性,是其超集。code

  • Objective-C使用動態綁定的消息結構,也就是說,在運行時纔會檢查對象類型。orm

  • 接受一條消息以後,究竟應執行何種代碼,由運行期環境而非編譯器來決定。對象

相關文章
相關標籤/搜索