一直来搞iOS开发都是在学习Cocoa 框架,最近很多人说到iOS的runtime、runloop等cocoa的底层特性,也就想去学习加深自己对cocoa的理解。
最近就看了下runtime的一些知识,突然给了我一个惊喜!!一直来我都在为运营提出的需求,banner点击界面随便跳转而烦恼,在看runtime的时候发现竟然可以用runtime,瞬间喜出望外了。
要使用runtime特性,首先要引入 #import<objc/runtime.h> 类库
打开苹果runtime文档 会发现有很多惊喜等着你~~~
界面随便跳转 的做法可以看看这个,很好的一个东西!而且 发现 我们推送也可以用runtime来跳转东西,以前在推送接受里面写了一大推代码~~
打开这里 可以看到关于runtime的详细介绍;(下面记录一些runtime属于对oc的比较,详细的请看前面的文章)
1、Selector 在runtime中的定义 : typedef struct objc_selector *SEL; 使用SEL sel = @selector(xxxxx);
2、object-c 调用对象的方法,在runtime中 就是个Message(消息);
[self getNameForKey:key] 在runtime会变异成 objc_msgSend(self,@selector(xxxx),key) ;
3、IMP是指向方法实现的函数指针; typedef id (*IMP)(id self, SEL _cmd,...)
objc_msgSend的函数定义:id objc_msgSend(id slef,SEL sel, ...)
了解了一些基本的东西,就是要进入实用了。
一直来我也认为objectc category没有办法写属性,但是runtime可以做到这点~ runtime中是才用了键值关联
像正常定义的样子,定义一个属性,比如:定义一个name的属性,实现它的get set方法
#pragma mark - getter && setter
- (NSString *)name {
return objc_getAssociatedObject(self,&nameKey);
}
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, &nameKey, name,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
name 需要@dynamic来修饰,代表着自己手动实现get set方法
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) 第一个参数object 就是当前的对象,最后个参数是关联策略,对于key,一般来说定义成一个静态变量,static变量是放在静态存储区,应用结束系统自己收回,而且不容易造成冲突。。
object-c runtime很强大,其他的东西大家有兴趣可以到官网上面去看看。说的比较浅显,不对的地方请指正,谢谢~