OK! 讓我們接著來 談談 runTime
iOS runtime 運行時( - 俗談)
iOS runtime 運行時( 二 深談)
iOS runtime 運行時( 三 深談)
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_setAssociatedObject 這個方法,綁定了一個新的變量,通過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 這個標記 獲得 新添加的變量
Demo
不知道 大家,有沒有理解呢,歡迎大家 留言討論