1.object-c 怎麼實現多型
答:多型是在runtime裡面實現的,在編譯的時候,compiler把所有class的定義都存放在class 例項物件裡面,class例項物件包含了class的父class 例項物件的位址,class方法的select id和位址, class變數的偏移等。所有new出來的object都是從nsobject繼承過來的,所以所有物件都自動包含了乙個isa的指標,這個指標在呼叫alloc為object分配位址的時候被指向class物件的位址,在執行的時候,我們呼叫class 方法是通過給object傳送訊息
[myobj method]這樣的形式,但編譯器會把這句話替換成
id objc_msgsend(id thereceiver, sel theselector, ...)
selector來做的,這樣效率會比字串比較的效率要高。
objc_msgsend這個函式的執行過程大概就是,從thereceiver(也就是myobj)裡面得到isa的位址,這個位址指向前面講到的
編譯器生成的class的object例項的位址(具體的結構請參考the objective-c programming language),然後比較方法的selector
如果找到了,就知道了method的位址,就直接呼叫了。
2.物件的method是怎麼訪問物件 變數的?
答:在編譯期間,編譯器可以知道指定class的所有繼承關係,所以它也知道要生成的object包含的所有變數(包含了父類的)。這樣
[myobj method];
這樣知道了object的首位址和變數的偏移,也就知道了變數的位址。
3。self和super關鍵字是怎麼實現的?
object c文件中舉的例子來了解為什麼非常容易出錯。
上面我們提到了method在被呼叫的時候,會被傳入隱含引數,第乙個隱含引數就是object的位址,self實際上在編譯期間被替換成了
ojbect的位址,所以堆self傳送的訊息都是根標準流程一樣通過isa鏈找到method來執行。
其中objc_super的結構是
struct objc_super注意到;
objc_msgsendsuper和
id objc_msgsend(id thereceiver, sel theselector, ...)的區別,多了乙個class class;
class實際上就指向了找到當前method的class 物件的例項。
所以在objc_msgsendsuper中查詢方法是從引數class指向的class 例項物件的isa開始查詢的,而不是從thereceiver也就是myobj
這個物件的isa開始查詢的
Oracle Inventory裡的一些概念
事務處理 transaction 是指物料移入庫存 在庫存內移動以及移出庫存.物料搬運單 move order 是在乙個組織內對物料進行移動的請求.保留 reservation 是 與需求 之間的關聯。保留將在 與需求 之間建立乙個永久的資料關聯,代表指定需求 的乙個可靠的物料分配。現有量 on h...
Object c一些基礎知識
int main int argc,const char argv 0代表程式是正常退出,任何非0的返回值代表有錯誤產生 nslog輸出各種資料型別的表示式 import int main int argc,const char argv return 0 鍵盤輸入的示例 import int ma...
data structure 樹的一些基本概念
定義 乙個樹,每個內部節點,最多只有兩個子節點,每個節點的子節點是有序的,一般稱為left child和right child。遞迴的定義 乙個樹有乙個單個根節點,或者乙個樹其根節點有兩個有序的子節點,每個節點又是乙個二叉樹的根節點。對於非空二叉樹t,n 0 為葉子節點數,而 n 2 是度2節點數,...