利用runtime獲取類方法, 類協(xié)議, 類成員變量及其應(yīng)用

本人有若干成套學(xué)習(xí)視頻, 可試看! 可試看! 可試看, 重要的事情說(shuō)三遍 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

之前, 寫過(guò)幾篇關(guān)于runtime運(yùn)行時(shí)的文章:

這次, 正在研究博愛寫得框架:

之前在字典轉(zhuǎn)模型的核心算法里, 提到了如何獲取一個(gè)類屬性列表. 其實(shí), runtime不僅僅給我們提供了獲取屬性列表的方法, 同時(shí)還有獲取成員變量列表, 獲取方法列表, 獲取協(xié)議列表的方法.

其實(shí)步驟都差不多, (以獲取方法列表為例):

  • 先看屬性中是否已經(jīng)保存了方法列表, 這一步主要是防止反復(fù)獲取列表, 提升性能.
    NSArray *methods = objc_getAssociatedObject(self, kYFMethodsKey);
    if (methods) {
        return methods;
    }
  • 然后用runtime里的方法獲取方法列表:
Method *cMethods = class_copyMethodList([self class], &count);
  • 遍歷方法列表, 將方法轉(zhuǎn)換成OC字符串, 并添加到可變數(shù)組中:
    for (unsigned int i = 0; i < count; i++) {
        Method method = cMethods[i];
        SEL methodSel = method_getName(method);
        NSString *ocMethodName = NSStringFromSelector(methodSel);
        [mtArray addObject:ocMethodName];
    }
  • 為屬性設(shè)置方法列表值, 并返回方法列表:
    objc_setAssociatedObject(self, kYFMethodsKey, mtArray, OBJC_ASSOCIATION_COPY_NONATOMIC);
    return objc_getAssociatedObject(self, kYFMethodsKey);

利用運(yùn)行時(shí)獲取的屬性列表, 成員變量列表有什么用呢?
我們可以修改系統(tǒng)沒(méi)有公開的一些屬性:

比如UIAlertController, 默認(rèn)的ActionAlert模式是這樣的:

ActionAlert

但是, 如果我們想修改它的顏色怎么辦呢?
我們可以先打印出UIAlertController的屬性列表:

`UIAlertController `的屬性列表

我們發(fā)現(xiàn)屬性很多, 但是有兩個(gè)屬性引起了我們的注意:

attributedTitleattributedMessage
我們可以將標(biāo)題和信息的文本設(shè)置成富文本, 然后用KVC的方式設(shè)置給這兩個(gè)屬性:
然后我添加了這樣一段代碼:

    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@"哈哈哈" attributes:@{
                                                                                                               NSForegroundColorAttributeName : [UIColor brownColor],
                                                                                                               }];
    [alertVc setValue:attrStr forKey:@"attributedTitle"];
    NSMutableAttributedString *msgAttrStr = [[NSMutableAttributedString alloc] initWithString:@"用這種方式設(shè)置信息真的好嗎?" attributes:@{
                                                                                                                             NSForegroundColorAttributeName : [UIColor redColor],
                                                                                                                             NSFontAttributeName : [UIFont boldSystemFontOfSize:14],
                                                                                                                             }];
    [alertVc setValue:msgAttrStr forKey:@"attributedMessage"];

成功覆蓋掉了之前的原始文本, 將我們需要的效果呈現(xiàn)了出來(lái):

運(yùn)行效果

但是, 確定按鈕和取消按鈕的顏色應(yīng)該如何設(shè)置呢?
這時(shí),我們打印UIAlertAction的成員變量列表, 發(fā)現(xiàn)了有這么個(gè)變量_titleTextColor

`UIAlertAction`的成員變量列表

這應(yīng)該就是我們需要的, 于是我加上了這樣兩句代碼:

    [cancelAction setValue:[UIColor cyanColor] forKey:@"_titleTextColor"];
    [confirmAction setValue:[UIColor orangeColor] forKey:@"_titleTextColor"];

發(fā)現(xiàn), 真的設(shè)置成功了:

運(yùn)行效果

關(guān)于runtime的分類和這個(gè)小demo, 歡迎大家下載:
下載鏈接(密碼: vxj6)

PS. 本人有若干成套學(xué)習(xí)視頻, 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,106評(píng)論 0 9
  • 我們常常會(huì)聽說(shuō) Objective-C 是一門動(dòng)態(tài)語(yǔ)言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,353評(píng)論 0 7
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,906評(píng)論 33 466
  • 【海拔五千】 1.早上兩節(jié)課解決連乘的實(shí)際問(wèn)題。完善乘法模型,主要是引導(dǎo)孩子用大腦思考問(wèn)題,側(cè)重多種解題方法的訓(xùn)練...
    作者如意閱讀 252評(píng)論 0 0
  • 你會(huì)挽著我的衣袖,我會(huì)把手插進(jìn)褲兜
    南極姑娘jiajia閱讀 311評(píng)論 0 0

友情鏈接更多精彩內(nèi)容