dynamic詳細介紹

2021-06-08 22:28:40 字數 2241 閱讀 4586

objective-c 2.0 中增加了@dynamic 指令,表示變數對應的屬性訪問器方法,是動態實現的,你需要在nsobject 中繼承而來的+(bool) resolveinstancemethod:(sel) sel 方法中指定動態實現的方法或者函式。

person.h:

[cpp]view plain

copy

@inte***ce person : nsobject  

-(person*) initwithweight: (int

) weight;  

@property (retain,readwrite) nsstring* name;  

@property (readonly)float

weight;  

@property float

height;  

-(void

) print: (nsstring*) str;  

@end  

person.m:

[cpp]view plain

copy

void

dynamicmethod(id self,sel _cmd,

float

w)  

@implementation person  

@synthesize name;  

@synthesize weight;  

@dynamic height;  

-(person*) initwithweight: (int

) w  

return

self;  

}  -(void

) print: (nsstring*) str  

+(bool

) resolveinstancemethod: (sel) sel  

return

result;  

}  -(void

) dealloc  

@end  

這裡我們對於介面中的height在實現類中使用了@dynamic指令,緊接著,你需要指定乙個函式或者其他類的方法作為height的setter、getter方法的執行時實現。為了簡單,我們指定了person.m中定義的函式(注意這是c語言的函式,不是objective-c的方法)dynamicmethod

作為height的setter方法的執行時實現。被指定為動態實現的方法的dynamicmethod的引數有如下的要求:

a.第乙個、第二個引數必須是id、sel;

b.第三個引數開始,你可以按照原方法(例如:setheight:(float))的引數定義。

再接下來,你需要覆蓋nsobject 的類方法resolveinstancemethod,這個方法會把需要動態實現的方法(setheight:)的選擇器傳遞進來,我們判斷一下是否是需要動態實現的選擇器,如果是就把處理權轉交給dynamicmethod。如何轉交呢?這裡我們就要用到執行時函式class_addmethod(class,sel,imp,char)。

言歸正傳,我們來解釋一下這裡需要用到的class_addmethod 方法,這個方法有四個引數,class 表示你要為哪個型別增加方法,sel 引數表示你要增加的方法的選擇器,imp 表示你要新增的方法的執行時的具體實現的函式指標。其實在這裡你能夠看出sel 並不能在執行時找到真正要呼叫的方法,imp 才可以真正的找到實現方法的。

現在我們來正式的看以下第四個引數v@:f 的含義,它描述了imp 指向的函式的描述資訊,按照@encode 指令編譯之後的字元說明,第乙個字元v 表示返回值為void,剩餘的字元為dynamicmethod 函式的引數描述,@表示第乙個引數id,:自然就是第二個引數sel,f 就是第三個引數float。由於前面說過動態方法的實現的前兩個引數必須是id、sel,所以第四個引數中的字串的第

二、三個字元一定是@:。我們看到resolveinstancemethod 方法的返回值為bool,也就是這個方法返回yes 表示找到了動態方法的具體實現,否則就表示沒有在執行時找到真實的實現,程式就匯報錯。

經過了上面的處理,objective-c 的執行時只要發現你呼叫了@dynamic 標註的屬性的setter、getter 方法,就會自動到resolveinstancemethod 裡去尋找真實的實現。這也就是說你在main.m 中呼叫peson.height 的時候,實際上dynamicmethod 函式被呼叫了。實際上除了@dynamic 標註的屬性之外,如果你呼叫了型別中不存在的方法,也會被

C 中 Var 和 dynamic 整理介紹

常有人會拿var這個關鍵字來和dynamic做比較。實際上,var和dynamic完全是兩個概念,根本不應該放在一起做比較。var實際上是編譯期拋給我們的 語法糖 一旦被編譯,編譯期會自動匹配var 變數的實際型別,並用實際型別來替換該變數的申明,這看上去就好像我們在編碼的時候是用實際型別進行申明的...

Dynamic程式設計

場景 1 dynamic d getsomeobject 2 d.quack dynamic obj dynamic custom binding language binding runtimebinderexception dynamic的執行時描述 這樣,可以在支援dynamic的語言中使用d...

robots txt詳細介紹

robots.txt基本介紹 當乙個搜尋機械人 有的叫搜尋蜘蛛 訪問乙個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜尋機械人就會按照該檔案中的內容來確定訪問的範圍 如果該檔案不存在,那麼搜尋機械人就沿著鏈結抓取。另外,robots.txt必須放置在乙個站點的根目錄下,...