OK! 讓我們接著來 談?wù)?runTime
iOS runtime 運(yùn)行時(shí)( - 俗談)
iOS runtime 運(yùn)行時(shí)( 二 深談)
iOS runtime 運(yùn)行時(shí)( 三 深談)
iOS runtime 運(yùn)行時(shí)( 四 深談)
上一篇 聊的是: 在不知道一個(gè)對象有什么屬性的情況下宜猜, 獲取對象的所有屬性硝逢,然后可以改變屬性的值绅喉, 今天我們談?wù)?怎么通過Category(類別)+runtime 給一個(gè)類 添加一個(gè)新的屬性垫毙,一般情況下综芥,我們通常背的概念都是,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);
系統(tǒng)類 NSObject虾啦,通過 objc_setAssociatedObject 這個(gè)方法傲醉,綁定了一個(gè)新的變量,通過objc_getAssociatedObject 這個(gè)方法得到 新綁定的變量硬毕,稍后再細(xì)講這兩個(gè)方法,核心就是綁定了一個(gè)變量逻悠,通過這個(gè)模式我們來把我們一開始的目的實(shí)現(xiàn)
下面我們 新建一個(gè)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
由于系統(tǒng)類韭脊,是不可變的,通過這個(gè)方法饥伊,就可以變相的給NSObject 添加了一個(gè)屬性
下面我們來嘗試一下:
在新的類里任内,引入頭文件
import "NSObject+FYAddtions.h"
NSObject *object = [[NSObject alloc] init];
object.hotelName = @"哈哈哈";
NSLog(@"%@",object.hotelName);
這樣 我們就通過 Category(類別)+runtime 給一個(gè)類 添加一個(gè)新的屬性融柬,感覺 怎么樣粒氧,有的人是不是 感覺在項(xiàng)目里不知道怎么用呢,是的,這種變態(tài)的寫法翼雀,只有 很變態(tài)的需求才會(huì)讓廣大程序員(媛)不得不翻資料孩擂,使用這樣的方法,下面給大家 發(fā)兩個(gè) 類別狈邑,一行代碼 搞定 UIAlertView UIActionSheet,不用再寫代理去區(qū)分很多個(gè)彈出框了蚤认,就使用了這樣的方法達(dá)到了 消除代理的 目的
點(diǎn)擊去下載
好了目的實(shí)現(xiàn)了,下面說說 這兩個(gè)方法
1.objc_setAssociatedObject(self, &FYObjProKey, hotelName, OBJC_ASSOCIATION_COPY);
self 是要給哪個(gè)對象添加 變量
&FYObjProKey 是對這個(gè)變量的標(biāo)記蘸嘶,獲得這個(gè)變量也是需要這個(gè)key值得
hotelName 是 這個(gè) 變量的值
OBJC_ASSOCIATION_COPY 這個(gè) 是添加變量的策略陪汽,和屬性的copy類似
一共有 5 個(gè)策略
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 這個(gè)標(biāo)記 獲得 新添加的變量
Demo
不知道 大家,有沒有理解呢雪情,歡迎大家 留言討論