runtime為什麼可以動態新增變數和方法?

2021-06-25 19:38:55 字數 1372 閱讀 6417

先介紹兩個結構體:

1.類中每乙個方法在內部轉換後的結構體

structobjc_method

注:每乙個例項化物件都有乙個isa指標,通過isa,這個物件可以訪問其類的結構,進而訪問繼承的類的結構;

呼叫class_addmethod新增成員方法的步驟:

1.定義乙個要新增的方法;

2.建立objc_method結構體的例項,為例項的method_name 和 method_imp賦值;

3.因為每乙個類都有乙個函式列表objec_method_list,當程式執行時,類例項化出乙個物件時,該物件藉由isa指標,找到了所在的類,然後呼叫class_addmethod為這個類的objec_method_list新增新的方法。

補充:1.class_addmethod(targetclass,@selector(),(imp)函式名稱,「v@:@」;

2. 上面是為乙個已經存在的類(其objec_method_list已經存在)新增方法,中是為乙個自定義的新類(還沒有objec_method_list)新增方法,所以需要先malloc乙個objec_method_list,然後給objec_method_list新增方法。

舉個

#import

@inte***ceemptyclass : nsobject()

@end

@implementatonemptyclass

@end

idsayhello(id self, sel _cmd, …)

voidaddmethod()

為什麼category可以新增方法不能新增變數

oc是不能直接修改物件的結構體的成員變數屬性,一般做法是先取出物件的結構體變數,修改該取出來的結構體變數裡面的成員,再把結構體物件賦值給原來的結構體變數,在ui中為了簡化 一般對uiview做乙個category,這個分類把上面修改結構體成員變數的方法封裝起來,inte ce uiview exte...

金為什麼可以生水?水為什麼可以生木?

五行相生,金生水 水生木 木生火 火生土 土生金,在現代人看來,有些不可理解,例如 金為什麼可以生水?水為什麼可以生木?同理,五行相剋,金剋木 木剋土 土剋水 水剋火 火剋金當中,木剋土 土剋水之類,也有點不好理解,似乎與常識有些格格不入。其實,一切產生於古代的文化,都必須用那個時代的常識或理念來解...

動態規劃為什麼可以減少計算

摘自leetcode 動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分 即子問題 再根據子問題的解以得出原問題的解。動態規劃往往用於優化遞迴問題,例如斐波那契數列,如果運用遞迴的方式來求解會重複計算很多相同的子問題,利用動態規劃的思想可以減少計算量。通常許多子問題非常...