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

iOS高级编程-使用类目方法给一个类添加属性

2015-04-23 12:07 435 查看
看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性,

比如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
{
    
    objc_setAssociatedObject(self, &StaticManagerKey,
                             manager,
                             OBJC_ASSOCIATION_ASSIGN);
}

- (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

总结:当我们使用 运行时方法给一个 类添加属性之后,我们就可以非常方便的使用它了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐