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

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

比如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

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

时间: 2024-10-11 08:49:06

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

Runtime的实践——给一个类添加属性(关联对象)

相关文章: <Runtime的初步认识--结构体与类> <Runtime的初步认识--消息机制> 一提到给一个类添加点什么,我们有可能首先就想到类别(Category).那么我们就弄一下. 利用 Category 给现有的类添加属性 比如我们要给一个 NSArray 添加一个属性叫做NSString *name. 我们首先新建一个Objective-C文件. File: Name File Type:Category Class:NSArray 然后我们在NSArray+Name.

iOS运行时Runtime浅析

运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@selector(doSomething))来执行.这篇博客会较为全面的来讲解下Runtime. OC是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理.这种动态语言的优势在于:写代码能更加灵活,可以把消息转发给想要的对象,或者随意交换一个方法的实现. OC Runtime目前有两个版本:M

Runtime 运行时:方法与消息

Runtime 运行时:方法与消息 这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制.我们将详细讨论消息的发送及消息的转发. 基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; bjc_selector结构体的详细定义没有在 SEL sel1 = @selector(method1); NSLog(@"sel : %p", sel1); 输出: sel

iOS 运行时(runtime)浅析

本博客,直接从分类说起.都知道OC中的分类是不能直接添加属性的,意思间接是能添加属性的.那应该怎么添加呢?那就要用到运行时(runtime)机制. 一,运行时金典用法之一 现在,给HGPerson类增加一个分类:HGPerson+HG.h,给一个属性如下: @property (nonatomic, copy) NSString* name; 貌似,这样写了以后,是能调用的,但是运行就报错了. -[HGPerson setName:]: unrecognized selector sent to

iOS开发:详解Objective-C runTime

Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例如:RunLoop,Block,内存管理等.其他的问题如果有机会我会在其他文章中介绍. 本篇文章主要介绍RunTime. RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编

iOS开发之删除过期Provisioning Profiles方法

2014-05-15 22:02 by Jeff Li 前言 系列文章:[传送门] 马上快要期末考试了,为了学点什么.就准备这系列的博客,记录复习的成果. 正文-计数  概率 概率论研究随机事件.它源于赌徒的研究.即使是今天,概率论也常用于赌博.随机事件的结果是否只凭运气呢?高明的赌徒发现了赌博中的规律.尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性.这是概率论的核心. "概率"到底是什么?这在数学上还有争议."频率派"认为概率是重复尝试多次,某种结

iOS开发之单例模式下的初始化方法

iOS开发之单例模式下的初始化方法 一般的单例我们会这么写 +(instancetype)sharedXXXManager{ static XXXManager *sharedXXXManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate,^{ sharedXXXManagerInstance = [[XXXManager alloc] initPrivate]; }); return sh

运行时(Runtime)机制

运行时机制 运行时机制是用 C++ 开发的,是一套苹果开源的框架 OC 是基于运行时开发的语言 应用场景 运行时动态获取类的属性 主要应用:字典转模型框架 MJExtension,JSONModel 利用 关联对象 为分类添加属性 利用 交换方法 拦截系统或其他框架的方法 误区:并不是使用的技术越底层,框架的效率就会越高 代码演练 导入头文件 #import <objc/runtime.h> 获取对象属性列表 第1步-获取对象属性数量 + (NSArray *)properties { uns

IOS开发隐藏键盘的4种方法

IOS开发隐藏键盘的4种方法 开发的app中常会用到键盘输入完成后隐藏键盘的情况.在此总结了4种方法来实现我们的目的. 方法一--delegate方式 第一种隐藏键盘的方法,称为delegate三步法: 1. 遵循(委托/代理); 2. 调用; 3. 关联头文件(ViewController.h)中遵循代理 . 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDel