1. 程式人生 > >runtime獲取檢視內部成員變數(OC和Swift兩種方法獲取)

runtime獲取檢視內部成員變數(OC和Swift兩種方法獲取)

在開發中經常有些需求,憑藉著蘋果提供的API不好實現,或者實現起來比較麻煩。此時,

我們就可以運用runtime來獲取類的內部成員變數,然後運用KVC進行替換,來達到目的。

下面就貼出運用runtime來獲取內部成員變數的方法,以獲取UITextView類為例:

1>運用Object-C程式碼實現:

unsigned int count = 0;
    Ivar *vars = class_copyIvarList([UITextView class], &count);
    
    for (int i = 0; i < count; i++) {
        Ivar var = vars[i];
        NSLog(@"%s", ivar_getName(var));
    }
    free(vars);
執行後,列印結果如下:


2>運用Swift程式碼實現:

var count: UInt32 = 0
        let ivars = class_copyIvarList(UITextView.self, &count)
        
        for i in 0 ..< count {
            let ivar = ivars![Int(i)]
            let name = ivar_getName(ivar)
            print(String(cString: name!))
        }
        free(ivars)
執行後列印結果如下:


從列印結果就可以看出來,能夠獲取蘋果內部沒有暴露出來的成員變量了。

補充:

成員變數和屬性的區別

以下面的一句程式碼為例進行說明

@property (nonatomic, readonly, strong) UIView *contentView;
簡單來說,成員變數就是帶有下劃線的,沒有帶下劃線的就是屬性。(_contentView就是成員變數,contentView就是屬性)

我們都知道,定義一個屬性,蘋果會自動生成它的成員變數,setter和getter方法