码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发大招-使用运行时runtime方法给一个类添加属性

时间:2015-04-23 13:20:30      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:ios开发高级   运行时添加属性   runtime大招   类目与runtime结合使用   封装af和 hud   

看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性,

比如PPrealSideController 就给 UIViewController添加了一个 self.pprealSideController的属性?

他是如何实现的呢?


1.基本的实现思路


首先我们需要了解,实际上 在我们使用  类似于self.newProperty的语句的时候,

根据点语法的规则实际上是调用的  setNewProperty方法,和  newProperty方法,

那我们可以知道他肯定是给一个  UIViewController添加了一个类目,然后 给它添加了

set和get方法(同上),所以看到这里我们可以知道 他添加的  self.newProperty实际上

只是一个形式上的属性,当你使用 _newProperry的时候是不可以的!

所以这种形式的‘属性‘ 只能使用点的形式去调用.


2.使用runtime方法来建立关联


虽然我们知道了可以使用类目给一个类添加两个方法,也就是间接的属性,

但是如何把我们需要存储的 属性值  和它关联起来呢?

在  <objc/runtime.h>运行时框架里给我们提供了对应的方法,可以让我们 用一个静态的 key

给 一块内存 赋值,方然也可以使用这个 key 获取到对应的 值


对应的方法是:

    objc_setAssociatedObject(self, &StaticManagerKey,
                             manager,
                             OBJC_ASSOCIATION_RETAIN);


和 

objc_getAssociatedObject(self, &StaticManagerKey);


使用示例:

我们给一个 UIViewController类添加一个 manager属性:

我们需要建立一个 UIViewController类目,详细代码如下:

.h

//
//  UIViewController+BBManager.h
//  HuanYouWang
//
//  Created by MBinYang on 15/4/23.
//  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "BBRequest.h"
@interface UIViewController ()
@property(strong,nonatomic)BBRequest *manager;
@end

@interface UIViewController (BBManager)

@end

可以看到 我们给UIViewController添加了一个 manager属性 ,实际上这个属性的 作用就是 给我们在.h中提供 一个 setManager方法,和 manager方法;


.m

//
//  UIViewController+BBManager.m
//  HuanYouWang
//
//  Created by MBinYang on 15/4/23.
//  Copyright (c) 2015年 cc.huanyouwang. All rights reserved.
//

#import "UIViewController+BBManager.h"
#import <objc/runtime.h>

@implementation UIViewController (BBManager)

static char StaticManagerKey;

- (void)setManager:(BBRequest *)manager
{
    [self willChangeValueForKey:@"StaticManagerKey"];
    objc_setAssociatedObject(self, &StaticManagerKey,
                             manager,
                             OBJC_ASSOCIATION_RETAIN);
    [self didChangeValueForKey:@"StaticManagerKey"];
}

- (BBRequest *)manager
{
    return objc_getAssociatedObject(self, &StaticManagerKey);
}

@end

可以看到 ,我们在  .m中,实现了  set,get方法.


使用示例,我们在一个 UIViewController的子类中测试   :

在TestViewController中 导入

UIViewController+BBManager.h

然后测试:

self.manager = [[BBRequest alloc]init];//调用 set方法
    [self.manager doSomething];//调用  get方法

可以看到 我们 为 一个  UIViewController成功添加了一个 属性  manager.


更多原文:http://blog.csdn.net/yangbingbinga


下一篇:使用运行时来高度包装 AF和 HUD


总结:当我们使用 运行时方法给一个 类添加属性之后,我们就可以非常方便的使用它了







iOS开发大招-使用运行时runtime方法给一个类添加属性

标签:ios开发高级   运行时添加属性   runtime大招   类目与runtime结合使用   封装af和 hud   

原文地址:http://blog.csdn.net/yangbingbinga/article/details/45219955

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!