您的位置:首页 > 移动开发 > IOS开发

iOS Runtime应用实例(一)类别添加属性

2015-11-10 10:45 387 查看
原创Blog,转载请注明出处

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属性

继承的缺点很明显,加入一个用户已经写好了一堆代码,那么每次使用子类导致了他的修改很多。而实用类别,对原有代码几乎没有影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS Runtime Category