菜鳥成長記 runtime歷程

2021-07-11 18:04:41 字數 2463 閱讀 4858

去面乙個有一年以上工作年限的ios開發崗位,如果面試官不是搞技術的,runtime一般問不到,但凡是乙個懂技術的面試官面乙個一年以上的求職者,runtime執行機制是多半會問到的,runtime非常強大,很多人都敗在它魔爪之下,當然我在專案中還沒有用到過runtime,一般比較好點的三方庫都會使用到runtime,比如:mjextension、afnetworking等。

今天就自己遇到的乙個專案中的技術點,學習了一哈runtime,今天就總結一下學習的知識點。

1:runtime是一套比較底層的純c語言api,屬於乙個c的語言庫,oc**在程式執行過程中,都轉化為runtime的c語言**。從字面理解譯為執行時,

所謂執行時,也就是在編譯時是不存在的,只是在執行過程中才去確定物件的型別、方法等。利用runtime機制可以在程式執行時動態修改類、物件中的所有屬性、方法等。

包含標頭檔案:#import

2:獲取乙個物件或類中的所有方法:

class_copymethodlist([

self

class],

&outcount);

unsigned int count;

method* methods =   class_copymethodlist([self class], &count);

for (unsigned i; i

// 獲取方法名稱,但是型別是乙個sel選擇器型別

sel methodsel = method_getname( methods[i]);

// 需要獲取c字串

const char *name1 = sel_getname(methodsel);

// 將方法名轉換成oc字串

nsstring *methodname = [nsstring stringwithutf8string:name1];  

// 獲取方法的引數列表

int arguments = method_getnumberofarguments( methods[i]);

nslog(@"方法名:%@, 引數個數:%d", methodname, arguments); }

free(name count);//避免記憶體洩漏

3:獲取乙個物件或類中的所有屬性名及對應的值:

class_copypropertylist(

[self

class],

&count);

unsigned int count;

objc_property_t * namecount =   class_copypropertylist([self class], &count);

for (unsigned i; i

const char * name =   property_getname(namecount[i]);

// 得到屬性名

nsstring *propertyname = [nsstring stringwithutf8string:name];

nslog(@"%@",propertyname);

// 獲取屬性值

id propertyvalue = [self valueforkey:propertyname];

nslog(@"%@",propertyvalue);

}free(name count);//避免記憶體洩漏

4:獲取物件的成員變數名稱:class_copyivarlist([

self

class],

&count);

unsigned int count = 0;

ivar *ivars = class_copyivarlist([self class], &count);

for (nsuinteger i = 0; i < count; ++i) 

free(ivars);

寫到這裡只列舉了一部分功能,當然我們獲取到這麼屬性名、或變數名有什麼作用了,當然是很實用的了,這時候我們可以根據需求,對某個變數名利用kvc技術獲取其對應的值,例如:無論是在xib或**中都無法修改placeholder的顏色及其大小,

這是就需要利用runtime機制獲取uitextfield

的所有變數名,看是否存在沒有公開的屬性或變數名,

_placeholderlabel變數名就是,這時候就會發現確實存在,那麼就可以利用kvc機制獲取對應的物件 並改變功能

改變uitextfield  

placeholder

文字顏色及大小  kvc機制

[textfield setvalue:[uicolor redcolor] forkeypath:@"_placeholderlabel.textcolor"];  

[textfield setvalue:[uifont boldsystemfontofsize:16] forkeypath:@"_placeholderlabel.font"];  

小菜鳥成長記

include define n 100 typedef struct book book int num 0,pnum int arrin book a,int pnum 輸入陣列元素,個數num由程式中自己確定。return i void arrout book a,int num 輸出陣列各元...

菜鳥成長記(零)

越是真理,就越是趨於簡單,關鍵是,你願不願,你敢不敢這樣去做。所以,當找不到出路處於迷茫低古的時候,最好的辦法就是將當前自己最想做的,能做好的事情做到極致,做到無人能及。25歲年薪20 萬 一直以來都想寫點什麼,但是每次想著想著都不知道該從 寫起,現在的生活感覺已經完全亂套了,懶散消極已經在心底蔓延...

菜鳥vimer成長記 目錄

菜鳥vimer成長記 第0章 我眼中的vim學習 菜鳥vimer成長記 第1章 統一概念 菜鳥vimer成長記 第2.0章 模式初探 菜鳥vimer成長記 第2.1章 normal模式 菜鳥vimer成長記 第2.2章 visual模式 菜鳥vimer成長記 第2.3章 insert模式 菜鳥vim...