使用performSelector做訊息分發

2021-09-19 07:30:46 字數 1845 閱讀 4310

一、應用場景

1、performselector是執行時系統負責去找方法的,在編譯時候不做任何校驗;如果直接呼叫編譯是會自動校驗。cocoa支援在執行時向某個類新增方法,即方法編譯時不存在,但是執行時候存在,這時候必然需要使用performselector去呼叫。所以有時候如果使用了performselector,為了程式的健壯性,會使用檢查方法- (bool)respondstoselector:(sel)aselector;

2、直接呼叫方法時候,一定要在標頭檔案中宣告該方法的使用,也要將標頭檔案import進來。而使用performselector時候,可以不用import標頭檔案包含方法的物件,直接用performselector呼叫即可。

3、需要在pod庫a裡面呼叫另外乙個pod庫b中的方法

二 延遲執行使用

[obj performselector:@selector(play) withobject:@「李周」 afterdelay:4.f];

當然runloop為了節省資源並不會在準確的時間點觸發事件。

而performselector:withobject:afterdelay:其實就是在內部建立了乙個nstimer,然後會新增到當前執行緒的runloop中。所以當該方法新增到子執行緒中時,需要格外的注意兩個地方:1.會發現方法並沒有被呼叫,因為子執行緒中的runloop預設是沒有啟動的狀態。2.子執行緒中兩者的順序必須是先執行performselector延遲方法之後再執行run方法。

dispatch_queue_t queue = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

dispatch_async(queue, ^);

三、 多參傳遞

以nsarray的形式傳值,然後建立nsinvocation的方式,將引數一一繫結。

-(id)performselector:(sel)aselector withobject:(nsarray *)object

//使用nsinvocation進行引數的封裝

nsinvocation *invocation = [nsinvocation invocationwithmethodsignature:signature];

invocation.target = self;

invocation.selector = aselector;

//減去 self _cmd

nsinteger paramterscount = signature.numberofarguments - 2;

paramterscount = min(object.count, paramterscount);

for (int i = 0; i < paramterscount; i++)

[invocation invoke];

id returnvalue = nil;

if (signature.methodreturnlength > 0)

return returnvalue;}

///nsnumber *age = [nsnumber numberwithint:20];

nsstring *name = @「zcp」;

nsstring *gender = @「男」;

nsarray *friends = @[@「1」,@「2」];

sel selector = nsselectorfromstring(@「getage:name:gender:friends:」);

nsarray *array = @[age,name,gender,friends];

[self performselector:selector withobject:array];

使用GraphEdit使用

1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

學習使用CSDN markdown使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...