去面乙個有一年以上工作年限的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...