运行时

运行时

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值