iOS Runtime应用实例(一)类别添加属性
来源:互联网 发布:java constructor类 编辑:程序博客网 时间:2024/05/01 02:01
原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:类别添加属性是Runtime最常见的一个应用。也是个人用的比较多的,前段时间有个需求是要求统计App中的每个控件被点击的次数,虽然友盟能做,不过我们希望统计更加详细,这样就要自己开发一个统计分析的SDK了。每个控件要打一个标签,这时候类别添加属性的作用就体现出来了。
如果为类别添加属性?
使用Runtime.h中的两个方法
这两个方法是为一个对象设置关联对象,等价于添加一个属性
objc_setAssociatedObjectobjc_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属性
继承的缺点很明显,加入一个用户已经写好了一堆代码,那么每次使用子类导致了他的修改很多。而实用类别,对原有代码几乎没有影响。
3 0
- iOS Runtime应用实例(一)类别添加属性
- iOS Runtime应用实例(一)类别添加属性
- iOS为类别添加属性的方法(RunTime)
- 利用runtime给类别添加属性
- 类别添加属性,即runtime运行时添加属性(动态属性)
- iOS 类别 ---不能添加属性
- iOS 给类别添加属性
- iOS (Category)runtime动态添加属性
- Runtime(三)利用运行时来为类别添加属性
- IOS在类别中添加属性
- iOS 给类别里面添加属性
- IOS类别通过关联对象添加属性
- iOS 如何给类别添加属性
- iOS runtime的应用实例
- iOS runtime的应用实例
- iOS runtime的应用实例
- iOS runtime的应用实例
- RunTime应用--动态给分类添加属性
- sql cookbook笔录(二)
- Hadoop MapReduce具体运行过程
- 菜鸟都会使用的在mac上github上传项目
- test
- javascript学习之路--判断浏览器是否支持javascript解释型脚本语言。
- iOS Runtime应用实例(一)类别添加属性
- nginx的hash
- 在tomcat访问时无需填写项目名称的配置
- 单链表的排序
- VS2013 图片资源无法加载
- [一心想做张江程序员]Infopath设置Develop开发工具集成
- 内存管理
- FIFA knows how to deliver a seamless football experience
- 根据线程快照分析性能瓶颈四