iOS_经验(1)_Runtime_Api查询

0丶介绍

Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时。需要一个运行时系统 (runtime system) 来执行编译后的代码。
Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。

官网文档还提供关于传统和现代版本Runtime的说明
In the legacy runtime, if you change the layout of instance variables in a class, you must recompile classes that inherit from it.
In the modern runtime, if you change the layout of instance variables in a class, you do not have to recompile classes that inherit from it.In addition, the modern runtime supports instance variable synthesis for declared properties (see Declared Properties in The Objective-C Programming Language).

一丶Objective-C运行时定义了几种重要的类型。

-Class:定义Objective-C类
-Ivar:定义对象的实例变量,包括类型和名字。
-Protocol:定义正式协议。
-objc_property_t:定义属性。叫这个名字可能是为了防止和Objective-C1.0中的用户类型冲突,那时候还没有属性。
-Method:定义对象方法或类方法。这个类型提供了方法的名字(就是**选择器**)、参数数量和类型,以及返回值(这些信息合起来称为方法的**签名**),还有一个指向代码的函数指针(也就是方法的**实现**)。
-SEL:定义选择器。选择器是方法名的唯一标识符。
-IMP:定义方法实现。这只是一个指向某个函数的指针,该函数接受一个对象、一个选择器和一个可变长参数列表(varargs),返回一个对象。
-Class:定义Objective-C类
-Ivar:定义对象的实例变量,包括类型和名字。
-Protocol:定义正式协议。
-objc_property_t:定义属性。叫这个名字可能是为了防止和Objective-C1.0中的用户类型冲突,那时候还没有属性。
-Method:定义对象方法或类方法。这个类型提供了方法的名字(就是**选择器**)、参数数量和类型,以及返回值(这些信息合起来称为方法的**签名**),还有一个指向代码的函数指针(也就是方法的**实现**)。
-SEL:定义选择器。选择器是方法名的唯一标识符。
-IMP:定义方法实现。这只是一个指向某个函数的指针,该函数接受一个对象、一个选择器和一个可变长参数列表(varargs),返回一个对象。

二丶API的速查手册使用

1.objc_xxx 系列函数

函数名称函数作用
objc_getClass获取Class对象
objc_getMetaClass获取MetaClass对象
objc_allocateClassPair分配空间,创建类(仅在 创建之后,注册之前 能够添加成员变量)
objc_registerClassPair注册一个类(注册后方可使用该类创建对象)
objc_disposeClassPair注销某个类
objc_allocateProtocol开辟空间创建协议
objc_registerProtocol注册一个协议
objc_constructInstance构造一个实例对象(ARC下无效)
objc_destructInstance析构一个实例对象(ARC下无效)
objc_setAssociatedObject为实例对象关联对象
objc_getAssociatedObje*ct获取实例对象的关联对象
objc_removeAssociatedObjects清空实例对象的所有关联对象
objc_msgSend发送ObjC消息

**objc_系列函数关注于宏观使用,如类与协议的空间分配,注册,注销等操作**

2.class_xxx 系列函数**

函数名称函数作用
class_addIvar为类添加实例变量
class_addProperty为类添加属性
class_addMethod为类添加方法
class_addProtocol为类遵循协议
class_replaceMethod替换类某方法的实现
class_getName获取类名
class_isMetaClass判断是否为元类
objc_getProtocol获取某个协议
objc_copyProtocolList拷贝在运行时中注册过的协议列表
class_getSuperclass获取某类的父类
class_setSuperclass设置某类的父类
class_getProperty获取某类的属性
class_getInstanceVariable获取实例变量
class_getClassVariable获取类变量
class_getInstanceMethod获取实例方法
class_getClassMethod获取类方法
class_getMethodImplementation获取方法的实现
class_getInstanceSize获取类的实例的大小
class_respondsToSelector判断类是否实现某方法
class_conformsToProtocol判断类是否遵循某协议
class_createInstance创建类的实例
class_copyIvarList拷贝类的实例变量列表
class_copyMethodList拷贝类的方法列表
class_copyProtocolList拷贝类遵循的协议列表
class_copyPropertyList拷贝类的属性列表

**class_系列函数关注于类的内部,如实例变量,属性,方法,协议等相关问题**

3.object_xxx 系列函数**

函数名称函数作用
object_copy对象copy(ARC无效)
object_dispose对象释放(ARC无效)
object_getClassName获取对象的类名
object_getClass获取对象的Class
object_setClass设置对象的Class
object_getIvar获取对象中实例变量的值
object_setIvar设置对象中实例变量的值
object_getInstanceVariable获取对象中实例变量的值 (ARC中无效,使用object_getIvar)
object_setInstanceVariable设置对象中实例变量的值 (ARC中无效,使用object_setIvar)

**objcet_系列函数关注于对象的角度,如实例变量**

4.method_xxx 系列函数

函数名称函数作用
method_getName获取方法名
method_getImplementation获取方法的实现
method_getTypeEncoding获取方法的类型编码
method_getNumberOfArguments获取方法的参数个数
method_copyReturnType拷贝方法的返回类型
method_getReturnType获取方法的返回类型
method_copyArgumentType拷贝方法的参数类型
method_getArgumentType获取方法的参数类型
method_getDescription获取方法的描述
method_setImplementation设置方法的实现
method_exchangeImplementations替换方法的实现

-
**method_系列函数关注于方法内部,如果方法的参数及返回值类型和方法的实现**
****

5.property_xxx 系列函数**

函数名称函数作用
property_getName获取属性名
property_getAttributes获取属性的特性列表
property_copyAttributeList拷贝属性的特性列表
property_copyAttributeValue拷贝属性中某特性的值
-
**property_系类函数关注与属性*内部,如属性的特性等**

6.protocol_xxx 系列函数

函数名称函数作用
protocol_conformsToProtocol判断一个协议是否遵循另一个协议
protocol_isEqual判断两个协议是否一致
protocol_getName获取协议名称
protocol_copyPropertyList拷贝协议的属性列表
protocol_copyProtocolList拷贝某协议所遵循的协议列表
protocol_copyMethodDescriptionList拷贝协议的方法列表
protocol_addProtocol为一个协议遵循另一协议
protocol_addProperty为协议添加属性
protocol_getProperty获取协议中的某个属性
protocol_addMethodDescription为协议添加方法描述
protocol_getMethodDescription获取协议中某方法的描述

7.ivar_xxx 系列函数

函数名称函数作用
ivar_getName获取Ivar名称
ivar_getTypeEncoding获取类型编码
ivar_getOffset获取偏移量

8.sel_xxx 系列函数

函数名称函数作用
sel_getName获取名称
sel_getUid注册方法
sel_registerName注册方法
sel_isEqual判断方法是否相等

9.imp_xxx 系列函数

函数名称函数作用
imp_implementationWithBlock通过代码块创建IMP
imp_getBlock获取函数指针中的代码块
imp_removeBlock移除IMP中的代码块

三丶简单使用

1. 动态的添加对象的成员变量和方法
2. 动态交换两个方法的实现
3. 实现分类也可以添加属性
4. 实现NSCoding的自动归档和解档
5. 实现字典转模型的自动转换

//1.检查是否有某个属性或变量

- (BOOL)hasAttribute:(NSString *)attName
{
    BOOL flag = NO;
    u_int count;
    Ivar *ivars = class_copyIvarList([self class], &count);
    for (int i = 0; i < count; i++)
    {
        const char *propertyName = ivar_getName(ivars[i]);
        NSString *strName = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];
        if ([attName isEqualToString:strName])
        {
            flag = YES;
        }
        NSLog(@"===>%@", strName);
    }
    return flag;
}

//2.获取属性列表

unsigned int count;
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for (unsigned int i = 0; i< count; i++)
{
    const char *name = property_getName(propertyList[i]);
    NSLog(@"__%@",[NSString stringWithUTF8String:name]);
    
    //得到属性的各种信息
    { //得到属性的各种信息
        objc_property_t property = propertyList[i];
        const char *a = property_getAttributes(property);
        NSLog(@"属性信息__%@",[NSString stringWithUTF8String:a]);
    }
}

//3.交换2个方法

第一种:
Method oldMethod1 = class_getInstanceMethod([self class], @selector(viewDidLoad));
Method newMethod1 = class_getInstanceMethod([self class], @selector(xzbViewDidLoad));
method_exchangeImplementations(oldMethod1, newMethod1);
第二种:
Method oldMethod1 = class_getInstanceMethod([self class], @selector(viewDidLoad));
Method newMethod1 = class_getInstanceMethod([self class], @selector(xzbViewDidLoad));
method_setImplementation(oldMethod1, method_getImplementation(newMethod1));

//4.创建一个新类:objc_allocateClassPair


//创建一个新类:objc_allocateClassPair
Class newClass = objc_allocateClassPair([UIView class], "XZBCustomView", 0);
//给类增加新的方法:class_addMethod
class_addMethod(newClass, @selector(report), (IMP)ReportFunction, "v@:");
//注册新类:objc_registerClassPair
objc_registerClassPair(newClass);

//实例;
id instanceOfNewClass = [[newClass alloc] init];
//调用report
[instanceOfNewClass performSelector:@selector(report)];

void ReportFunction(id self, SEL _cmd)
{
    NSLog(@"This object is %p",self);//This object is 0x7fb2d2e0f900
    NSLog(@"Class is %@,and super is %@",[self class],[self superclass]);// Class is XZBCustomView,and super is UIView
    Class currenClass = [self class];
    for (int i = 0; i<5; i++)
    {
        NSLog(@"%d  %p",i,currenClass);
        //获取isa指针指向的对象object_getClass
        currenClass = object_getClass(currenClass);
        NSLog(@"NSObject:%p",[NSObject class]);
        NSLog(@"object_getClass:%p",object_getClass([NSObject class]));
        
    }
}

四丶扩展

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,558评论 33 466
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,195评论 0 7
  • 目录 Objective-C Runtime到底是什么 Objective-C的元素认知 Runtime详解 应用...
    Ryan___阅读 1,939评论 1 3
  • 本文转载自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex阅读 761评论 0 1
  • 抚琴在花丛 花如尔颜容 蝴蝶点点飞 疏影沐春风
    真沾老刘阅读 139评论 2 1