1. 程式人生 > >iOS底層原理(二):Runtime研究(二)

iOS底層原理(二):Runtime研究(二)

這個篇幅我們繼續研究Runtime,這裡給大家介紹Runtime的API

  • objc_系列函式關注於巨集觀使用,如類與協議的空間分配,註冊,登出等操作

  • class_系列函式關注於類的內部,如例項變數,屬性,方法,協議等相關問題

  • objcet_系列函式關注於物件的角度,如例項變數

  • method_系列函式關注於方法內部,如果方法的引數及返回值型別和方法的實現

  • property_系類函式關注與屬性*內部,如屬性的特性等

  • protocol_系類函式關注與協議相關

  • ivar_xxx函式關注與例項變數的東西

  • sel_xxx主要討論關於方法編號相關的東西

  • imp_xxx主要討論關於方法實現相關的

下面我們來玩一下這些常用的api

//交換方法
        Method m1 = class_getInstanceMethod(self, @selector(viewWillAppear:));
        Method m2 = class_getInstanceMethod(self, @selector(tz_viewWillAppear:));        
        method_exchangeImplementations(m1, m2);
// 關聯屬性
- (void)setViewColor:(NSString *)viewColor{

    objc_setAssociatedObject(self, &associatedObjectKey, @"addProperty", OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSString *)viewColor{
    return objc_getAssociatedObject(self, &associatedObjectKey);
}

 /// 建立一類對
    Class TZCat = objc_allocateClassPair([NSObject class], "TZCat", 0);

    /// 新增例項變數
    // const char* types= "
[email protected]
:" NSString* name = @"name"; class_addIvar(TZCat, name.UTF8String, sizeof(id), log2(sizeof(id)), @encode(id)); // 新增方法 class_addMethod(TZCat, @selector(hunting), (IMP)hunting, "[email protected]:"); /// 註冊類 objc_registerClassPair(TZCat); // 建立例項物件 id cat = [[TZCat alloc] init]; [cat setValue:@"Tom" forKey:@"name"]; NSLog(@"name = %@", [cat valueForKey:name]); /// 方法呼叫 [cat performSelector:@selector(hunting)]; // 獲取成員變數列表 unsigned int count = 0; Ivar* ivars = class_copyIvarList([self class], &count); for (int i = 0; i < count; i++) { Ivar var = ivars[i]; const char* name = ivar_getName(var); NSString* key = [NSString stringWithUTF8String:name]; id value = [self valueForKey:key]; [aCoder encodeObject:value forKey:key]; } free(ivars);

以上就是這篇文章的全部內容了,希望本文的內容對大傢俱有一定的參考學習價值,同時歡迎大家進入小編交流群:624212887,一起交流學習,謝謝大家的支援