运行时
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 方法交换