运行时

来源:互联网 发布:淘宝9.9元全国包邮 编辑:程序博客网 时间:2024/06/02 14:52

运行时

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


get方法 

objc_getAssociatedObject(object,key)

set方法 

objc_setAssociatedObject(object,key, value,policy)

OBJC_ASSOCIATION_ASSIGN = 0, /*< 指定一个弱引用相关联的对象. / OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /< 指定一个强引用相关联的对象. nonatomic. / OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /< 指定相关的对象被复制. nonatomic. / OBJC_ASSOCIATION_RETAIN = 01401, /< 指定一个强引用相关联的对象. atomically. / OBJC_ASSOCIATION_COPY = 01403 /< 指定相关的对象被复制. atomically. /
objc_removeAssociatedObjects(object)//object 源对象//一般使用objc_setAssociatedObject 设为nil 来清除关联

为类添加属性Demo 

static char flashColorKey;-(void) setFlashColor:(UIColor *) flashColor{      objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }-(UIColor *) flashColor{      return objc_getAssociatedObject(self, &flashColorKey); }

为类添加方法

class_addMethod(Class cls, SEL name, IMP imp, const char *types)cls //要添加方法的类;name //添加的方法在本类里面叫做的名字,格式要和添加的方法一样;imp //IMP就是Implementation的缩写,它是指向一个方法实现的指针,每一个方法都有一个对应的IMP;types//比如:"v@:"意思就是这已是一个void类型的方法,没有参数传入。 //再比如 "i@:"就是说这是一个int类型的方法,没有参数传入。 //再再比如"i@:@"就是说这是一个int类型的方法,又一个参数传入。

为类添加方法DEMO

Person *p = [[Person alloc]init];class_addMethod([Person class], @selector(zc_xxx), class_getMethodImplementation([ViewController class], @selector(zc_addMethod)), "v@:");[p performSelector:@selector(zc_xxx)];- (void)zc_addMethod{    NSLog(@"addMethod");}

方法交换

Method old = class_getInstanceMethod([ViewController class], @selector(viewWillAppear:));Method new = class_getInstanceMethod([ViewController class], @selector(addFind));method_exchangeImplementations(old, new);//class_getInstanceMethod 获取方法//method_exchangeImplementations 方法交换


0 0
原创粉丝点击