2012年6月25日 星期一

(isa 指針) and (id) in Dynamic typing

蘋果原始資料
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html

isa 指針: NSObject 中有一個 Class isa 的指針類型的成員變量,因為我們的對象大都直接或者間接的從 NSObject 繼承而來,因此都會繼承這個 isa 成員變量,isa 在運行時會指向對象的 Class 對象, 一個類的所有對象的 Class 對象都是同一個(JAVA 也是如此),這保證了在內存中每一個類 型都有唯一的類型描述。這個 Class 對象中也有個 isa 指針,它指向了上一級的父類的 Class 對象。 在明白了這個 isa 之後,你就可以明白在繼承的時候,A extends B,你調用 A 的方法 a(),首 先 A 的 isa 到 A 的 Class 對象中去查找 a()方法,找到了就調用,如果沒找到,就驅使 A 的 Class 對象中的 isa 到父類 B 的 Class 對象中去查找。

參考 http://www.guan8.net/Java/1164462.html

Objective-C一個特別的data type。id就是:
typedef struct objc_object {
Class isa;
} *id;
而Class本身就是個pointer:
typedef struct objc_class *Class;
所以isa稱為isa pointer。
        基本設計理念就是:不管任何型態的 Object 都是由 pointer 來指定,這也就是為什麼在 Objective-C 裡,任何 Object variable 的宣告都是 pointer (*),只有 primitive data type 以及 C struct 是例外。

至此,我們可定義一個id object如下:
id anObject;
     
          與下面的寫法同義
       #import "MyObject.h"
          MyObject *anObject;
  
不同之處在於若寫成 MyObject *anObject; 時,compiler 能夠從 MyObject.h 得知 MyObject class 的宣告內容,而在 compile 時幫忙檢查對於 myobj 的存取是否符合定義。

 

nil 即為null object,也就是id值為0,id、nil及其他basic type object都在objc/objc.h裡面。
objects均是 dynamically typing,也就是說,在程式執行時(run time)才最後決定該object的type。
 Dynamic typing 也就是直到 Runtime 時才來決定 Object 究竟為何種 class,最重要的就   是 (id) 的設計

任何 Object 不論其類別為何,在 Runtime 時才會 allocate memory 並由 isa 來決定它真正的類別,而非如同 C++ 在 compile time 時,就安排好不同類別的記憶體配置。
這種不指定特定類別的方式其實就替"未來"可能有新的類別保留了非常大的彈性,也不需要特別以 design pattern 來花太多心思設計 abstract class (interface),對於寫程式的人來說可以很直覺。

PS. 這種 Dynamic typing 與 ECMAScript 中的 prototype chain 設計原理相同,但 ECMAScript 則有更大的彈性,可以在 Runtime 時任意改變其 prototype;雖然理論上 Objective-C 也可以辦得到,但目前似乎沒有這樣的設計。


 參考  http://愛瘋手機.tw/node/4664-2009-08-11.htm
           http://rintarou.dyndns.org/2010/12/09/objective-c-%E6%B7%BA%E8%AB%87/



沒有留言: