運行時運用

一 , 設置關聯(lián)屬性
分類中設置屬性進行關聯(lián)判斷(其中SDWebimage中用到過)
/**
 * 下載圖像的 URL 字符串
 * 一個屬性:分類中不能有 ivar(成員變量) / getter / setter
 */
const char *jq_URLStringKey = "jq_URLStringKey";

@property (nonatomic, copy) NSString *jq_urlString;

- (NSString *)jq_urlString {
    //利用運行時記錄屬性
    return objc_getAssociatedObject(self, jq_URLStringKey);
}

- (void)setJq_urlString:(NSString *)jq_urlString {
   
    objc_setAssociatedObject(self, jq_URLStringKey, jq_urlString, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
二, 運行時動態(tài)調用方法(在OC與JS的交互中用到)
#import <objc/message.h>

1 > 調用無返回值的方法
參數(shù)一位當前調用方法對象
參數(shù)二為方法對象
參數(shù)三為需要傳遞的參數(shù)
下面是最基本的調用格式
SEL sel = NSSelectorFromString(methodName);
((void(*)(id, SEL, id))objc_msgSend)(self, sel, parameter);

2 > 調用有返回值的方法
 NSString *result = ((NSString *(*)(id, SEL, id, id, id))objc_msgSend)(self, sel, parameter, parameter2, parameter3);

- (NSString *)showFood1:(NSString *)food1 Food2:(NSString *)food2 Food3:(NSString *)food3 {
   
    NSLog(@"%@ -- %@ -- %@", food1, food2, food3);
    return @"delicious";
}
3 > 調用類方法, 需要將類轉為類對象
    Class personClass = [Person class];
   
    [personClass performSelector:@selector(drink)];
    ((void(*)(id, SEL))objc_msgSend)(personClass, @selector(drink));
三, 動態(tài)獲取類的屬性和成員變量(字典轉模型或KVC改變系統(tǒng)屬性變量)
const void *propertyListKey = @"propertyListKey";

+ (NSArray *)jq_propertyList {
   
    // 0. --- 判斷屬性數(shù)組是否存在溃列,如果存在直接返回 `屬性數(shù)組對象` ---
    NSArray *result = objc_getAssociatedObject(self, propertyListKey);
   
    if (result != nil) {
        return result;
    }
   
    // 1. 獲取屬性數(shù)組
    unsigned int count = 0;
    objc_property_t *list = class_copyPropertyList([self class], &count);
   
    NSLog(@"屬性數(shù)量 %u", count);
   
    NSMutableArray *arrM = [NSMutableArray array];
    // 2. 遍歷數(shù)組
    for (unsigned int i = 0; i < count; i++) {
       
        // 1> 通過下標獲取屬性對象
        objc_property_t property = list[i];
       
        // 2> 獲取屬性的名稱
        const char *pty = property_getName(property);
       
        // 3> 轉換成 OC 的字符串
        NSString *str = [NSString stringWithUTF8String:pty];
       
        [arrM addObject:str];
    }
   
    //釋放數(shù)組
    free(list);
   
    // --- 保存屬性數(shù)組對象 ---
    objc_setAssociatedObject(self, propertyListKey, arrM, OBJC_ASSOCIATION_COPY_NONATOMIC);
   
    return arrM.copy;
}

+ (NSArray *)jq_ivarList {
   
    // 1. 取類的成員變量列表
    unsigned int count = 0;
    Ivar *list = class_copyIvarList([self class], &count);
   
    // NSLog(@"%u", count);
    NSMutableArray *arrayM = [NSMutableArray array];
   
    // 2. 遍歷數(shù)組
    for (unsigned int i = 0; i < count; i++) {
       
        // 1> 根據(jù)下標獲取成員變量
        Ivar ivar = list[i];
       
        // 2> 取 ivar 的名字
        const char *cName = ivar_getName(ivar);
       
        // 3> 轉換成 NSString
        NSString *name = [NSString stringWithUTF8String:cName];
       
        [arrayM addObject:name];
    }
   
    // 3. 釋放列表
    free(list);
   
    return arrayM.copy;
}
四, 動態(tài)交換方法(在AFNetworking中 URLSession 做了一個交叉方法, 交換了系統(tǒng)的resume 方法, 以便在系統(tǒng)調用時可以發(fā)送一個通知來監(jiān)聽方法實現(xiàn))
+ (void)load {

    Method originalMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
    Method swizzledMethod = class_getClassMethod([UIImage class], @selector(jq_imageNamed:));

    //交換方法
    method_exchangeImplementations(originalMethod, swizzledMethod);
}

+ (UIImage *)jq_imageNamed:(NSString *)imageName {
   
    // 1, 加載圖片
    UIImage *image = [UIImage jq_imageNamed:imageName];
   
    // 2, 判斷功能
    if (image == nil) {
        NSLog(@" image == nil");
    }
    return image;
}
五, 動態(tài)添加方法(不常用)
void laugh(id self, SEL _cmd, id param) {
   
    NSLog(@"%@ - %@ - %@", self, NSStringFromSelector(_cmd), param);
}
//當調用了沒有實現(xiàn)的方法就會調用
+ (BOOL)resolveInstanceMethod:(SEL)sel {
   
    NSLog(@"%@", NSStringFromSelector(sel));
   
    //動態(tài)添加laugh方法
    if (sel == @selector(laugh:)) {
       
        /*
         Class:   給哪個類添加
         SEL:     方法編號
         IMP:     方法實現(xiàn), 函數(shù)名
         types:   方法類型 v -> void  @ -> 第一個參數(shù) 表示id類型  : -> 代碼SEL 方法
         */
        class_addMethod(self, sel, (IMP)laugh, "v@:@");
       
        //處理完
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末劲厌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子听隐,更是在濱河造成了極大的恐慌补鼻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雅任,死亡現(xiàn)場離奇詭異风范,居然都是意外死亡,警方通過查閱死者的電腦和手機沪么,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門硼婿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禽车,你說我怎么就攤上這事寇漫。” “怎么了殉摔?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵州胳,是天一觀的道長。 經常有香客問我逸月,道長栓撞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瓤湘,結果婚禮上瓢颅,老公的妹妹穿的比我還像新娘。我一直安慰自己弛说,他們只是感情好挽懦,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剃浇,像睡著了一般巾兆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虎囚,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音蔫磨,去河邊找鬼淘讥。 笑死,一個胖子當著我的面吹牛堤如,可吹牛的內容都是我干的蒲列。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼搀罢,長吁一口氣:“原來是場噩夢啊……” “哼蝗岖!你這毒婦竟也來了?” 一聲冷哼從身側響起榔至,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤抵赢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唧取,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铅鲤,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年枫弟,在試婚紗的時候發(fā)現(xiàn)自己被綠了邢享。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡淡诗,死狀恐怖骇塘,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情韩容,我是刑警寧澤款违,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站宙攻,受9級特大地震影響奠货,放射性物質發(fā)生泄漏。R本人自食惡果不足惜座掘,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一递惋、第九天 我趴在偏房一處隱蔽的房頂上張望柔滔。 院中可真熱鬧,春花似錦萍虽、人聲如沸睛廊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽超全。三九已至,卻和暖如春邓馒,著一層夾襖步出監(jiān)牢的瞬間嘶朱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工光酣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疏遏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓救军,卻偏偏與公主長得像财异,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唱遭,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容

  • 一戳寸、深復制和淺復制的區(qū)別? 1拷泽、淺復制:只是復制了指向對象的指針疫鹊,即兩個指針指向同一塊內存單元!而不復制指向對象的...
    iOS_Alex閱讀 1,362評論 1 27
  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉跌穗,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評論 0 9
  • 目錄 Objective-C Runtime到底是什么 Objective-C的元素認知 Runtime詳解 應用...
    Ryan___閱讀 1,935評論 1 3
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,926評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理订晌,服務發(fā)現(xiàn),斷路器蚌吸,智...
    卡卡羅2017閱讀 134,629評論 18 139