关于Runtime在项目中使用的总结

来源:互联网 发布:淘宝网商城天天特价 编辑:程序博客网 时间:2024/05/11 05:26

关于Runtime在项目中使用的总结

关于Runtime其实有很多事情可以做,具体可以参考头文件objc/runtime.h,本文主要介绍在项目使用过程中,通过Runtime解决了的几个问题的用法。

[TOC]
- 解决接口属性隐藏问题
- 解决检查页面创建释放问题 (检查项目中的页面推出时dealloc是否调用)


问题一:解决接口属性隐藏问题

问题描述:在编写SDK的时候,经常发现一些接口文件中,有部分属性不需要暴露给用户,但是在SDK内部其他文件中又需要使用该属性,最开始碰到这种问题最傻的解决办法就是拆分为两个不相关的文件。以下提供两个我在项目中使用过的方法(依次演进):

方案1:

在主类的实现文件(比如ClassA.m)中申明需要隐藏的属性(对外部不可见),然后在类别(ClassA + Private.h)中添加对应的属性,这样就可以处理不需要公开给SDK外部使用,而且对内部透明的属性和方法:
这里写图片描述这里写图片描述
在SDK的头文件中不暴露ClassA + Private.h,然后SDK内部其他类中,如果要使用相关的属性和方法,可以直接引入ClassA + Private.h头文件,就可以顺利使用。目前这种方式只是在ClassA + Private.m中会有相应的警告,但目前未发现其他问题。

方案2:

ClassA.m中不添加属性,只在类别中ClassA + Private.h中添加属性,通过Runtime中的objc_getAssociatedObject()objc_setAssociatedObject()两个方法实现动态添加属性。
这里写图片描述

问题二:解决检查页面创建释放问题 (检查项目中的页面推出时dealloc是否调用)

问题描述:在优化一个旧项目的时候,有时候需要知道每个页面是否正常及时释放,但是由于之前编码人员未给每个页面都写了dealloc方法或者未在dealloc中输出打印,现在为了在每个页面释放的时候,打印一些信息。解决这个问题,主要方案如下(依次演进):

方案1

最傻的方法,每个要验证的页面添加dealloc打印,然后运行查看 。缺点:工作量太大;

方案2

增加一个上帝类,在这个类中实现dealloc打印功能,然后让其他页面继承自这个页面。缺点:无法解决多继承,而且对于新人需要指导这个用法;

方案3

为UIViewController建一个Category,然后重写dealloc方法覆盖页面本身的dealloc方法。缺点:本来的dealloc中其他的释放工作丢失;

方案4:

用Runtime方式解决这个问题,先给UIViewController增加一个类别,通过runtime中的class_addMethod()方法动态给UIViewController添加dealloc方法,用method_exchangeImplementations()方法,将UIViewController中的dealloc与自己的一个打印方法交换,无需要改其他代码,实现所有页面的释放的打印。方案4代码截图(主要是不知道怎么添加代码)如下:这里写图片描述

写在最后

虽然看过很多大神写的Runtime文章,目前就只在项目中使用了这两种情况。欢迎大家在评论区提供更好的解决方案或者想法,第一次用Markdown写博客,表示还不会用。。。

0 0
原创粉丝点击