iOS runtime 運行時( 三 深談)

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
不知道 大家,有沒有理解呢,歡迎大家 留言討論

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容