iOS RunTime 理解

  1. 可以遍歷對象的屬性
  2. 可以動態的添加、修改屬性,動態添加、修改、替換方法,動態添加、修改、替換協議
  3. 可以動態創建類、對象、協議
  4. 可以攔截方法

/**
利用runtime 可以實現一些OC 不容易實現的功能

  1. 動態交換兩個的實現(特別是交換系統自帶的方法)
  2. 動態添加成員變量和成員方法
  3. 獲得某個類的所有方法,所有變量
    */

OC: [obj func];
runtime: objc_msgSend(obj, @selector(func));

// 獲取屬性
id personClass = objc_getClass("CZPerson");
unsigned int outCount;
objc_property_t *propertys = class_copyPropertyList(personClass, &outCount);
for (int i = 0; i < outCount; i++) {
objc_property_t property = propertys[i];
printf("%s:%s\n", property_getName(property), property_getAttributes(property));
}

free(propertys);

/// 使用: 可以在分類中實現方法,替換原生方法,實現自己的想要的東西
// 獲取某個類的方法
// class_getClassMethod(__unsafe_unretained Class cls, SEL name)

// 獲取某個實例對象方法

// class_getInstanceMethod(__unsafe_unretained Class cls, SEL name)

// 交換兩個方法

// method_exchangeImplementations(Method m1, Method m2)

/// 使用: 在分類中使用getter setter 方法
// setter 將某個值跟某個對象關聯起來,將某個值存到對象中去

// objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
// getter
// objc_getAssociatedObject(self, nameKey);

/// 使用: 獲取類中的所有方法和變量

// class_copyIvarList(__unsafe_unretained Class cls, unsigned int *outCount)
// 獲取成員變量的名字
// ivar_getName(Ivar v);
// 獲取成員變量的類型
// ivar_getTypeEncoding(Ivar v)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容