runtime 動態新增方法

2021-07-13 07:36:23 字數 2232 閱讀 4660

動態新增方法:

動態新增就運用到懶載入

開發場景:如果乙個類方法很多,載入類到記憶體的時候也比較耗費資源,需要給每個方法生成乙個對映表(這個詞我也不懂),可以使用動態給某個類新增方法。

person *p = [[person alloc]init];

//perform

selector:即為動態新增方法

[p performselector:

@selector(eat) withobject:

nil];

// 會報警告,執行後會報錯,報的錯誤是因為你沒有在person類裡面實現eat方法

如果你想自己動態新增方法

首先你要在類中實現**如下:

#首先介紹相關的方法,後面再整合

/**處理例項方法

動態新增方法,首先實現這個resolveinstancemethod方法

resolveinstancemethod呼叫的情況:當呼叫了乙個沒有實現的方法,就會呼叫resolveinstancemethod這個方法

:沒有實現的方法

*/+ (bool)resolveinstancemethod:(sel)sel{}

// runtime 方法(匯入)

class_addmethod(, , ,

char *types#>)

:表示給哪個類新增 -- self

:方法編號 即為 方法名 -- 未實現的方法

:方法的實現,函式入口,函式指標或函式名 --在本類的@implementation 類名 下面

// 定義乙個函式(函式名隨便寫,imp要與之一致)

void tangtang_eat()

char *types#> :方法的型別 ---檢視xcode help document文件

xcode --> help --> document -->搜尋runtime --> 方法class_addmethod --> 檢視

char *types#>用法(也有整個動態新增方法的描述)

#根據蘋果系統的東西來

#import

"person.h"

#import

@implementation person

/** 預設乙個方法都有兩個引數,self,_cmd,為隱式引數,不顯示

self :方法的呼叫者

_cmd :呼叫方法的編號,即方法名

*///1. 定義乙個函式(函式名隨便寫)

// 無返回值,引數(id,sel)

void tangtang_eat(id self, sel _cmd)

/** 2.處理為實現的例項方法

動態新增方法,首先實現這個resolveinstancemethod方法

resolveinstancemethod呼叫的情況:當呼叫了乙個沒有實現的方法,就會呼叫resolveinstancemethod這個方法

:沒有實現的方法

*/+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}@end

#在viewcontroller中

#如果你要實現帶有引數的(自己找兩者的不同)

#person.m檔案中

// c語言中所有物件型別用 id

void tangtang_eat(id

self, sel _cmd, id prame1)

+ (bool)resolveinstancemethod:(sel)sel

return [super resolveinstancemethod:sel];

}#viewcontrollers中

Runtime(動態新增方法)

a問 有沒有使用過performselector,什麼時候使用?動態新增方法的時候使用過?怎麼動態新增方法?用runtime?為什麼要動態新增方法?b runtime 動態新增方法 oc都是懶載入機制,只要乙個方法實現了,就會馬上新增到方法列表中.qq,微博,直播等等應用,都有會員機制 任何方法預設...

Runtime 動態建立類新增屬性和方法

void createclass myclasstest是已經實現的函式,v 這種寫法見引數型別連線 class addmethod myclass,selector myclasstest imp myclasstest,v 註冊這個類到runtime系統中就可以使用他了 objc registe...

RunTime執行時之動態新增方法

import viewcontroller.h import person.h 複製 1 runtime 動態新增方法 oc都是懶載入機制,只要乙個方法實現了,就會馬上新增到方法列表中.qq,微博,直播等等應用,都有會員機制 performselector 去執行某個方法。performselect...