iOS 通過runtime獲取某個類中所有的變數和方法

LinXunFeng發表於2019-02-25

蘋果官方的類中只提供給我們一小部分成員變數和方法,但有時候我們需要的恰好就沒有提供,這樣就會令開發人員十分懊惱了,那怎樣才能獲取該類中所有的變數及方法,用來查詢是否有相對應的變數和方法呢?
我們可以使用蘋果自帶的 執行時(runtime) 來獲取

執行時(Runtime):

  • 蘋果官方一套C語言
  • 能做很多底層操作(比如訪問隱藏的一些成員變數成員方法….)

以下以 UITextField 為例

一. 包含執行時標頭檔案

#import <objc/runtime.h>  
複製程式碼

二. 獲取所有的成員變數

unsigned int count = 0;
    
// 拷貝出所胡的成員變數列表
Ivar *ivars = class_copyIvarList([UITextField class], &count);
    
for (int i = 0; i<count; i++) {
    // 取出成員變數
    Ivar ivar = *(ivars + i);
        
    // 列印成員變數名字
    LXFLog(@"%s", ivar_getName(ivar));
        
    // 列印成員變數的資料型別
    LXFLog(@"%s", ivar_getTypeEncoding(ivar));
}
    
// 釋放
free(ivars);
複製程式碼

Swift的寫法如下

var count: UInt32 = 0
let ivars = class_copyIvarList(UIViewController.self, &count)!
for i in 0..<count {
    let namePoint = ivar_getName(ivars[Int(i)])!
    let name = String(cString: namePoint)
    print(name)
}

複製程式碼

三. 獲取所有的成員方法

// 下面的UITextField改為你想獲取所有屬性的類名
// methCount: 這個類所有屬性的個數

unsigned int methCount = 0;
Method *meths = class_copyMethodList([UITextField class], &methCount);
    
for(int i = 0; i < methCount; i++) {
        
    Method meth = meths[i];
        
    SEL sel = method_getName(meth);
        
    const char *name = sel_getName(sel);
        
    NSLog(@"%s", name);
}
    
free(meths);
複製程式碼

最後,通過KVC的方式給相應的成員變數賦值即可!
如:

// 修改點位文字顏色
UILabel *placeholderLabel = [self valueForKeyPath:@"_placeholderLabel"];
placeholderLabel.textColor = [UIColor redColor];
// 或者這樣
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
複製程式碼

相關文章