iOS runtime 运行时( 三 )
上一篇 聊的是: 在不知道一个对象有什么属性的情况下, 获取对象的所有属性,然后可以改变属性的值, 今天我们谈谈 怎么通过Category(类别)+runtime 给一个类 添加一个新的属性,一般情况下,我们通常背的概念都是,Category(类别)只可以添加方法,不可以添加属性,但是有了runTime之后,一切就不一样了 上代码喽·····
引入
#import <objc/runtime.h>
添加
static void* FYObjProKey = @"FYObjProKey";
NSObject *object = [[NSObject alloc] init];
NSString *str = @"runTime添加的变量";
// 添加 属性
objc_setAssociatedObject(object, &FYObjProKey, str, OBJC_ASSOCIATION_COPY);
// 获取 属性
id objValue = objc_getAssociatedObject(object, &FYObjProKey); NSString *getStr = (NSString *)objValue;
NSLog(@"%@",getStr);
系统类 NSObject,通过 objc_getAssociatedObject 这个方法,绑定了一个新的变量,通过objc_getAssociatedObject 这个方法得到 新绑定的变量,稍后再细讲这两个方法,核心就是绑定了一个变量,通过这个模式我们来把我们一开始的目的实现
下面我们 新建一个NSObject的类别
#import <Foundation/Foundation.h>
@interface NSObject (FYAddtions)
@property(nonatomic,copy)NSString *hotelName;
@end #import "NSObject+FYAddtions.h"
#import <objc/runtime.h>
static void* FYObjProKey = @"FYObjProKey";
@implementation NSObject (FYAddtions) -(void)setHotelName:(NSString *)hotelName
{
objc_setAssociatedObject(self, &FYObjProKey, hotelName, OBJC_ASSOCIATION_COPY);
} -(NSString *)hotelName
{
return objc_getAssociatedObject(self, &FYObjProKey);
}
@end
由于系统类,是不可变的,通过这个方法,就可以变相的给NSObject 添加了一个属性
下面我们来尝试一下:
在新的类里,引入头文件
import "NSObject+FYAddtions.h"
NSObject *object = [[NSObject alloc] init];
object.hotelName = @"哈哈哈";
NSLog(@"%@",object.hotelName);
这样 我们就通过 Category(类别)+runtime 给一个类 添加一个新的属性,感觉 怎么样,有的人是不是 感觉在项目里不知道怎么用呢,是的,这种变态的写法,只有 很变态的需求才会让广大程序员(媛)不得不翻资料,使用这样的方法,下面给大家 发两个 类别,一行代码 搞定 UIAlertView UIActionSheet,不用再写代理去区分很多个弹出框了,就使用了这样的方法达到了 消除代理的 目的
点击去下载
好了目的实现了,下面说说 这两个方法
.objc_setAssociatedObject(self, &FYObjProKey, hotelName, OBJC_ASSOCIATION_COPY);
self 是要给哪个对象添加 变量
&FYObjProKey 是对这个变量的标记,获得这个变量也是需要这个key值得
hotelName 是 这个 变量的值
OBJC_ASSOCIATION_COPY 这个 是添加变量的策略,和属性的copy类似
一共有 个策略
OBJC_ASSOCIATION_ASSIGN; //assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC; //copy,nonatomic策略
OBJC_ASSOCIATION_RETAIN_NONATOMIC; // retain,nonatomic策略
OBJC_ASSOCIATION_RETAIN //retain策略
OBJC_ASSOCIATION_COPY //copy策略
.objc_getAssociatedObject(self, &FYObjProKey)
通过 &FYObjProKey 这个标记 获得 新添加的变量
iOS runtime 运行时( 三 )的更多相关文章
- ios - runtime运行时应用---交换方法
runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundColor的方法换成了自定义的pb_setBackgroundColor 首先创建UIV ...
- iOS runtime 运行时( 二 )
我们在编程过程中,如果使用到了runtime(运行时),我们几乎都是想动态的改变这个类的信息,包括方法,属性,balabala的,并且获得这个类的一些信息,等等,下面我们就来看看怎么通过runtime ...
- iOS runtime 运行时( - )
谈到运行时,相对应的就有编译时: 1).运行时-- 直到程序运行时才去确定一个对象的具体信息,并且可以改变这个类的具体信息,包括它的方法,变量等等: 2).编译时-- 是在程序运行之前,编译的时候,就 ...
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- Runtime运行时的那点事儿
注:本文是对 Colin Wheeler 的 Understanding the Objective-C Runtime 的翻译. 初学 Objective-C(以下简称ObjC) 的人很容易忽略一个 ...
- runtime 运行时机制 完全解读
runtime 运行时机制 完全解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! ...
- 编译器设计-RunTime运行时环境
编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...
- iOS开发之runtime运行时机制
最近参加三次面试都有被问到runtime,因为不太懂runtime我就只能支支吾吾的说点零碎.我真的好几次努力想看一看runtime的知识,因为知道理解它对理解OC代码内部变化有一定帮助,不过真心觉得 ...
- Objective-C Runtime 运行时之一:类与对象
Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一 ...
随机推荐
- Hadoop开发环境简介(转)
1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...
- Mac下安装eclipse+python+pydev+numpy+matplotlib
*本人亲测是成功的安装过程 1.更新Mac系统默认低版本的python2.7.请参见这篇文章:http://jingyan.baidu.com/article/14bd256e39b63dbb6d26 ...
- Hadoop学习笔记(2)
Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...
- UVaLive 7500 Boxes and Balls (数学)
题意:给定 n 个球,每次从每篮子里拿出来一个放在一个新篮子里,并移除相同的,按球的个数进行排序,问你用最多几个球能完成循环. 析:数学问题,很容易发现前n项和就是最多的球数,所以我们只要找最大的n项 ...
- Mongo数据模型
Mongo数据模型 一个Mongo系统(参考上述部署)包含一组数据库 一个 database 包含一组collection 一个 collection 包含一组document 一个 document ...
- [置顶] 小强的HTML5移动开发之路(9)——坦克大战游戏3
上一篇我们创建了敌人的坦克和自己的坦克,接下来就应该让坦克发子弹了,我们下面来看一下如何让我们的坦克发出子弹. 前面我们用面向对象的思想对Tank进行了封装,又利用对象冒充实现了我们的坦克和敌人的坦克 ...
- baseDao 使用spring3+hibernate4方式
启动异常: java.lang.ClassCastException: org.springframework.orm.hibernate4.SessionHolder cannot be cast ...
- li下用了浮动IE6的问题
li下用了浮动IE6的问题 直接看HTML <ul> <li><a href="#" target="_blank">沃尔沃 ...
- linux 源码编译(转)
源代码的用处无非是以下两点;1、软件根据用户的需要加以定制;2、二次开发;注:要根据软件的许可证书约定为准,开发者许可二次开发才行;1、源码包的打包格式;源代码一般以file.tar.gz file. ...
- Cocos2D-x权威指南:通过节点控制屏幕中的全体渲染对象
本节,已经能够利用我们眼下所学的知识做出一些有趣的东西.之前已经说过,CCNode类没有贴图,也就是说在屏幕上单独建立一个节点是没有不论什么效果的,可是能够通过这个"无形"的节点来 ...