Runtime實戰(zhàn)

為了學習Runtime武花,我們應該需要從幾個方面入手:

  1. 是什么?
  2. 為什么會出現(xiàn)杈帐?
  3. 怎么做体箕?
  4. 分享
  5. 能干嘛?

是什么挑童? 為什么會出現(xiàn)干旁?

C語言是靜態(tài)語言,決定階段是在編譯期炮沐,而我們偉大的Apple工程師(其實Objective-C不是Apple發(fā)明的,這里姑且這么算吧)把Objective-C定義為了動態(tài)語言回怜。那要讓Objectiive-C具有動態(tài)語言的特性大年,就必須有一個東西承載這種特性,而這種特性就是Runtime玉雾。個人理解翔试,如有偏頗見諒!
具體其他定義可Google搜索复旬,會看到有很多資料垦缅,不多說了。

怎么做驹碍?

在Objective-C中一個類其實主要分幾個部分:

  • protocol
  • Ivar
  • property
  • method

今天我們就來研究一下這主要的幾個部分壁涎。

先上一個隨便寫的類:

#import <Foundation/Foundation.h>

@protocol RuntimeBaseProtocol <NSObject>

@optional
- (void)doBaseAction;

@end

@protocol RuntimeProtocol <NSObject>

@required
- (void)doRequiredAction;

@optional
- (void)doOptionalAction;

@end

@interface RuntimeObject : NSObject <RuntimeProtocol,RuntimeBaseProtocol>
{
    NSString *name;
    NSString *kind;
}
@property (nonatomic, strong) NSString *value;
@property (nonatomic, assign) int age;

+ (void)doClassMethod;
@end

簡答解釋一下,我們定義了一個叫RuntimeObject的類志秃,類里面定義了一些東西:

  • 實現(xiàn)了RuntimeProtocol和RuntimeBaseProtocol協(xié)議
  • name怔球、kind兩個實例變量
  • value、age兩個property
  • doClassMethod函數(shù)

接下來就是我們今天真正的主題浮还,如何通過Runtime動態(tài)性的獲取到這些東西竟坛?

其一,我們先Get下Protocol:

unsigned int count;
__unsafe_unretained Protocol **protocols = class_copyProtocolList([RuntimeObject class], &count);
for (unsigned int i = 0; i < count; i++) {
      const char *name = protocol_getName(protocols[i]);
      printf("%s\n",name);
}

我們發(fā)現(xiàn)真的準確的輸出了呃钧舌!看:

RuntimeProtocol
RuntimeBaseProtocol
timg.jpeg

其二担汤,我們再來試試Get下Property:

unsigned int count;
objc_property_t *propertys = class_copyPropertyList([RuntimeObject class], &count);
for (unsigned int i = 0; i < count; i++) {
        const char *name = property_getName(propertys[i]);
        printf("%s\n",name);
}

輸出如下:

value
age
hash
superclass
description
debugDescription

提示:hash、superclass洼冻、description崭歧、debugDescription是從NSObject來的

我們再一次


timg.jpeg

接下來我們Get下Ivar、Method均告完美碘赖,哈哈哈<萑佟M夤埂!

分享

其實我們往上翻翻代碼不難看出播掷,Runtime給我們提供了一組函數(shù)审编,這些函數(shù)的形式主要為class_copyXXXX。這組函數(shù)就是用來獲取Ivar歧匈、Method垒酬、Property、Protocol的件炉,他們分別是:

  • class_copyIvarList
  • class_copyPropertyList
  • class_copyProtocolList
  • class_copyMethodList

能干嘛勘究?

如果你看到了這些,首先我先感謝你的支持斟冕!?? 但是我們還是得要討論下能用來干嘛呢口糕?有什么鳥用?上面所有的代碼都是在我自己寫的class基礎之上測試的磕蛇,我都已經(jīng)有我寫的代碼景描,何必多此一舉去獲取Method、Property等等吶秀撇?

騷年超棺,不急!我們假設哈呵燕,如果某天你的主管要求你把他手機上所有安裝過的手機的Bundle ID提取出來棠绘,然后用Excel表統(tǒng)計給他,你怎么搞再扭?你是不是想拿榔頭砸他-去你Y的氧苍,什么JB玩意。但是騷年霍衫,我們不要忘記了候引,我們是coder啊敦跌!我們難道就沒有辦法嗎澄干?

直接上解決方法:

Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
            NSObject *workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
            NSLog(@"Installed apps:%@",[workspace performSelector:@selector(allApplications)]);
#pragma clang diagnostic pop

你調(diào)試一下就知道了,這段代碼可以提取到所有已經(jīng)安裝過的App列表柠傍,包含Bundle ID喔麸俘!它就是通過Runtime去獲取workspace類,然后performSelector函數(shù)惧笛!

后記

好了从媚,Runtime先到這吧。其實它很簡單患整,也就是Apple提供了一堆函數(shù)給你拜效,然后讓你可以操作Ivar喷众、Protocol、Property紧憾、Method到千,也就僅此而已!

附帶:

  • 一張截圖就截這么多吧赴穗,剩下的都一樣
Runtime_1.jpg
  • 通過Class獲取鏈接庫名稱
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
const char *name = class_getImageName(LSApplicationWorkspace_class);
printf("%s\n",name);

落幕

所有測試代碼如下簡書也不能上傳附件了赵,不上GitHub了,太簡單了

        { // Ivar
            unsigned int count;
            Ivar *ivars = class_copyIvarList([RuntimeObject class], &count);
            for (unsigned int i = 0; i < count; i++) {
                Ivar ivar = ivars[i];
                const char *name = ivar_getName(ivar);
                printf("%s\n",name);
            }
        }
        printf("\n\n\n");
        { // property
            unsigned int count;
            objc_property_t *propertys = class_copyPropertyList([RuntimeObject class], &count);
            for (unsigned int i = 0; i < count; i++) {
                const char *name = property_getName(propertys[i]);
                printf("%s\n",name);
            }
        }
        printf("\n\n\n");
        { // protocol
            unsigned int count;
            __unsafe_unretained Protocol **protocols = class_copyProtocolList([RuntimeObject class], &count);
            for (unsigned int i = 0; i < count; i++) {
                const char *name = protocol_getName(protocols[i]);
                printf("%s\n",name);
            }
        }
        printf("\n\n\n");
        { // method
            unsigned int count;
            Method *methods = class_copyMethodList([RuntimeObject class], &count);
            for (unsigned int i = 0; i < count; i++) {
                SEL sel = method_getName(methods[i]);
                printf("%s\n",sel_getName(sel));
            }
        }
        printf("\n\n\n");
        { // Get dynamic framework name
            Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
            const char *name = class_getImageName(LSApplicationWorkspace_class);
            printf("%s\n",name);
        }
        printf("\n\n\n");
        { // Installed apps
            Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
            NSObject *workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
            NSLog(@"Installed apps:%@",[workspace performSelector:@selector(allApplications)]);
#pragma clang diagnostic pop
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甸赃,一起剝皮案震驚了整個濱河市柿汛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埠对,老刑警劉巖苛茂,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸠窗,居然都是意外死亡,警方通過查閱死者的電腦和手機胯究,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門稍计,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裕循,你說我怎么就攤上這事臣嚣。” “怎么了剥哑?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵硅则,是天一觀的道長。 經(jīng)常有香客問我株婴,道長怎虫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任困介,我火速辦了婚禮大审,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘座哩。我一直安慰自己徒扶,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布根穷。 她就那樣靜靜地躺著姜骡,像睡著了一般导坟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圈澈,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天惫周,我揣著相機與錄音,去河邊找鬼士败。 笑死闯两,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谅将。 我是一名探鬼主播漾狼,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饥臂!你這毒婦竟也來了逊躁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤隅熙,失蹤者是張志新(化名)和其女友劉穎稽煤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囚戚,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡酵熙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驰坊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾二。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拳芙,靈堂內(nèi)的尸體忽然破棺而出察藐,到底是詐尸還是另有隱情,我是刑警寧澤舟扎,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布分飞,位于F島的核電站,受9級特大地震影響睹限,放射性物質(zhì)發(fā)生泄漏譬猫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一羡疗、第九天 我趴在偏房一處隱蔽的房頂上張望删窒。 院中可真熱鬧,春花似錦顺囊、人聲如沸肌索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诚亚。三九已至晕换,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間站宗,已是汗流浹背闸准。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梢灭,地道東北人夷家。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像敏释,于是被迫代替她去往敵國和親库快。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉钥顽,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,732評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言义屏,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,199評論 0 7
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/10/25/objective-c-r...
    idiot_lin閱讀 937評論 0 4
  • Objective-C語言是一門動態(tài)語言蜂大,他將很多靜態(tài)語言在編譯和鏈接時期做的事情放到了運行時來處理闽铐。這種動態(tài)語言...
    tigger丨閱讀 1,406評論 0 8
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,569評論 33 466