通过Runtime间接注入 dealloc 代码
来源:互联网 发布:手机围棋记谱软件 编辑:程序博客网 时间:2024/06/06 03:02
先看一个情景(如果你没有类似的应用情景,就不用往下看啦,^_^)
// 为了在对象销毁时触发一些动作,不得不继承对象,然后实现Dealloc方法 @interface SCView : UIView @end @implementation SCView - (void)dealloc { // do sth............. } @end
继承一个类并不是什么大事情, 但有些对象是别人创建好的,你没法换成别的类,而且就为了一个Dealloc继承过来太麻烦了,借助运行时(Runtime),这情景可以很简单的解决.
首先我不提倡使用 method_exchangeImplementations 这种过于暴力而且缺乏美感的做法,我想说的是另一种思路--共生对象,什么是共生对象? 就是两个对象的生存周期是一样的(或者作用周期可以等效),通过操作其中一个对象,实现对另一个对象的干预,方法如下.
首先创建一个NSObject对象(越小的对象越好,因为只是作为一个寄宿体),然后在Dealloc方法中调用一个Block,大概就是这个样子
// 声明一个无参数的Block类型 typedef void(^EmptyBlock)(); @interface SCBlock : NSObject // 只需暴露一个setBlock方法 - (void)setDeallocBlock:(EmptyBlock)deallocBlock; @end // 然后实现功能 @implementation SCBlock { EmptyBlock _deallocBlock; } - (void)dealloc { if (_deallocBlock) _deallocBlock(); } - (void)setDeallocBlock:(EmptyBlock)deallocBlock { _deallocBlock = deallocBlock; } @end 好,到这里已经完成一半了,接下来做另一半. 现在创建了一个"共生"类出来,但还没有任何使用,通过强大的运行时把他们的生命关联起来 SCBlock *v1 = [[SCBlock alloc] init]; [v1 setDeallocBlock:^{ // do sth........ }]; // 核心,关键,重要! void *ptr = ((__bridge void *)v1); // v1对象必须只能由object持有,使用时注意! objc_setAssociatedObject(object, ptr, v1, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
你没看错,就是添加一个关联对象,object是要共生的对象(可以是任意对象),v1是我们可以操作的对象,因为对象在销毁时一定会先释放关联对象,由于v1只有共生对象持有,所以释放后v1销毁,触发Block动作,object释放完关联对象后自身也进入销毁动作,实现了两个对象的同生共死.
有些疑问,这东西有什么用? 有些时候您想知道一个系统对象是什么时候释放的话,这东西就能派上用场了~~~ ^_^
0 0
- 通过Runtime间接注入 dealloc 代码
- 通过Windows(Phone) Runtime Component来分享你的代码
- dealloc
- dealloc
- dealloc
- 通过指针变量间接访问另一个变量
- 通过远程线程向其他进程注入代码
- JDB调试Android程序(通过JDB进行代码注入)
- Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用
- 注入代码
- 代码注入
- 代码注入
- 通过runtime替换系统类实现的代码(从github开源库fdstackview中摘录)
- 通过提高教育素质来间接实施计划生育
- 代理模式 -- 通过代理对象间接访问对象
- 通过1级指针对变量间接赋值
- 间接直接通过list链表中的位置获取数据
- Runtime error代码解释
- SendMail发邮件
- oracle——SQL复习09
- shiro 的web集成使用
- SpringMVC数据验证——第七章 注解式控制器的数据验证、类型转换及格式化——跟着开涛学SpringMVC
- 在JBoss AS 7中将项目指定至'/'根目录
- 通过Runtime间接注入 dealloc 代码
- Java Core系列之ConcurrentHashMap实现(JDK 1.7)
- 1031. 查验身份证
- 浅谈算法和数据结构: 十一 哈希表
- Maven新建项目报错
- 自定义view 落叶效果
- Linux下修改root密码说明
- App 分发到企业平台下载
- 跟我学SpringMVC目录汇总贴、PDF下载、源码下载