iOS Runtime应用实例(一)类别添加属性
2015-11-10 10:45
387 查看
原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:类别添加属性是Runtime最常见的一个应用。也是个人用的比较多的,前段时间有个需求是要求统计App中的每个控件被点击的次数,虽然友盟能做,不过我们希望统计更加详细,这样就要自己开发一个统计分析的SDK了。每个控件要打一个标签,这时候类别添加属性的作用就体现出来了。
这两个方法是为一个对象设置关联对象,等价于添加一个属性
举个例子,和上文我说的统计分析SDK需要为控件添加一个属性
UIView+LeoExtension.h
UIView+LeoExtension.m
添加的属性可以是IBInspectable,IBOutlet等。例如,把上文中的改成IBInspectable,
那么,在storyboard上再拖拽出一个View的时候,会发现多了一个自定义的属性
举个例子,
现在很多navigationBar都会自动的改变透明度,现在我想写个SDK,用户可以动态的设置navigationBar背景的透明度。
可以的两种实现方式
继承,定义一个NavigationBar的子类,用户每次使用我这个子类
类别,添加一个自定义的alpha属性
继承的缺点很明显,加入一个用户已经写好了一堆代码,那么每次使用子类导致了他的修改很多。而实用类别,对原有代码几乎没有影响。
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:类别添加属性是Runtime最常见的一个应用。也是个人用的比较多的,前段时间有个需求是要求统计App中的每个控件被点击的次数,虽然友盟能做,不过我们希望统计更加详细,这样就要自己开发一个统计分析的SDK了。每个控件要打一个标签,这时候类别添加属性的作用就体现出来了。
如果为类别添加属性?
使用Runtime.h中的两个方法这两个方法是为一个对象设置关联对象,等价于添加一个属性
objc_setAssociatedObject objc_getAssociatedObject
举个例子,和上文我说的统计分析SDK需要为控件添加一个属性
UIView+LeoExtension.h
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface UIView (LeoExtension) @property (copy,nonatomic)NSString * leo_anaylizeTitle; @end
UIView+LeoExtension.m
#import "UIView+LeoExtension.h" #import <objc/runtime.h> static const char kAnaylizeTitle; @implementation UIView (LeoExtension) -(NSString *)leo_anaylizeTitle{ return objc_getAssociatedObject(self, &kAnaylizeTitle); } -(void)setLeo_anaylizeTitle:(NSString *)leo_anaylizeTitle{ objc_setAssociatedObject(self, &kAnaylizeTitle,leo_anaylizeTitle, OBJC_ASSOCIATION_COPY_NONATOMIC); } @end
注意事项
添加的属性要增加前缀,例如我上文添加的使用了Leo前缀,原因很简单,开发中难免要用到第三方库,不要和第三方库混淆。同时,iOS SDK会更新,也要确保不要和apple以后的属性名字冲突。添加的属性可以是IBInspectable,IBOutlet等。例如,把上文中的改成IBInspectable,
@property (copy,nonatomic) IBInspectable NSString * leo_anaylizeTitle;
那么,在storyboard上再拖拽出一个View的时候,会发现多了一个自定义的属性
应用场景
想添加属性,但是又不想继承的场景。大部分是为了扩展iOS SDK中的类,比如UIView,UIViewController。举个例子,
现在很多navigationBar都会自动的改变透明度,现在我想写个SDK,用户可以动态的设置navigationBar背景的透明度。
可以的两种实现方式
继承,定义一个NavigationBar的子类,用户每次使用我这个子类
类别,添加一个自定义的alpha属性
继承的缺点很明显,加入一个用户已经写好了一堆代码,那么每次使用子类导致了他的修改很多。而实用类别,对原有代码几乎没有影响。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Java Runtime Environment 5.0 Update 12 下载
- php set_magic_quotes_runtime() 函数过时解决方法
- Asp.Net 程序错误Runtime Error原因与解决
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 检测iOS设备是否越狱的方法
- System 类 和 Runtime 类的常用用法介绍
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件