iOS runtime 运行时( 三 深谈)

OK! 让我们接着上一篇来 谈谈 runTime
上一篇 聊的是: 在不知道一个对象有什么属性的情况下, 获取对象的所有属性,然后可以改变属性的值, 今天我们谈谈 怎么通过Category(类别)+runtime 给一个类 添加一个新的属性,一般情况下,我们通常背的概念都是,Category(类别)只可以添加方法,不可以添加属性,但是有了runTime之后,一切就不一样了 上代码喽·····

引入 #import

 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,就使用了这样的方法
点击去下载

好了目的实现了,下面说说 这两个方法

1.objc_setAssociatedObject(self, &FYObjProKey, hotelName, OBJC_ASSOCIATION_COPY);
self 是要给哪个对象添加 变量
&FYObjProKey 是对这个变量的标记,获得这个变量也是需要这个key值得
hotelName 是 这个 变量的值
OBJC_ASSOCIATION_COPY 这个 是添加变量的策略,和属性的copy类似 
一共有 5 个策略
OBJC_ASSOCIATION_ASSIGN;            //assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy,nonatomic策略
OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain,nonatomic策略
OBJC_ASSOCIATION_RETAIN //retain策略
OBJC_ASSOCIATION_COPY  //copy策略
2.objc_getAssociatedObject(self, &FYObjProKey)
 通过 &FYObjProKey 这个标记 获得 新添加的变量

不知道 大家,有没有理解呢,欢迎大家 留言讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值