運(yùn)行時(shí)runtime深度解析(四)—— 獲取類的屬性和方法列表

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.07.27

前言

OC是運(yùn)行時(shí)的語(yǔ)言,底層就是運(yùn)行時(shí)脯丝,可以說(shuō)runtime是OC的底層商膊,很多事情也都可以用運(yùn)行時(shí)解決,下面就講述一下運(yùn)行時(shí)runtime的知識(shí)以及它的妙用宠进。感興趣的可以看上面幾篇晕拆。
1. 運(yùn)行時(shí)runtime深度解析(一)—— API
2. 運(yùn)行時(shí)runtime深度解析(二)—— Method Swizzling在頁(yè)面統(tǒng)計(jì)上的應(yīng)用
3. 運(yùn)行時(shí)runtime深度解析(三)—— Method Swizzling在數(shù)組越界上的應(yīng)用

運(yùn)行時(shí)的幾種應(yīng)用

??前幾篇講了Method Swizzling在頁(yè)面統(tǒng)計(jì)和數(shù)組越界上的應(yīng)用昆庇,其實(shí)runtime還有很多地方可以使用,比如歸檔解檔表蝙、字典轉(zhuǎn)模型、獲取屬性方法等列表等∪欧ǎ可以看下圖,列出了runtime在很多地方的應(yīng)用。

runtime應(yīng)用

??這些應(yīng)用里面,JPatch熱更新今年已經(jīng)被蘋(píng)果明令禁止了沸伏,就不說(shuō)這個(gè)了,大家可以看一下別的方面的應(yīng)用姆另。這篇文章就主要講一下運(yùn)行時(shí)在獲取類的屬性列表以及方法列表中的應(yīng)用。


功能實(shí)現(xiàn)

下面就以代碼的形式獲取類的屬性列表和方法列表,下面就直接看代碼吧。

1. JJRuntimeVC.h
#import <UIKit/UIKit.h>

@interface JJRuntimeVC : UIViewController

@end
2. JJRuntimeVC.m
#import "JJRuntimeVC.h"
#import <objc/runtime.h>

@interface JJRuntimeVC ()

@property (nonatomic, assign) NSInteger number;
@property (nonatomic, strong) NSMutableArray *arrM;

@end

@implementation JJRuntimeVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor greenColor];
    
    [self setupUI];
    [self loadTimer];
    
    //獲取屬性列表
    NSArray *propertyArr = [[self class] loadAllProperties];
    NSLog(@"屬性列表 = %@",propertyArr);
    
    //獲取方法列表
    NSArray *methodArr = [[self class] loadAllMethods];
    NSLog(@"方法列表 = %@",methodArr);
}

#pragma mark - Object Private Function

- (void)setupUI
{

}

- (void)loadTimer
{

}

#pragma mark - Class Public Function

//獲取對(duì)象的所有屬性

+ (NSArray *)loadAllProperties
{
    u_int count;
    
    //將count的地址傳遞過(guò)去
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    
    NSMutableArray *propertyListArrM = [NSMutableArray arrayWithCapacity:count];
    
    for (int i = 0; i < count; i++) {
        //得到propertyName為c語(yǔ)言的字符串
        const char *propertyName = property_getName(properties[i]);
        //c字符串轉(zhuǎn)化為oc字符串
        [propertyListArrM addObject:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
    }
    
    //class_copyPropertyList為底層c語(yǔ)言染苛,我們使用完一定要記得釋放properties
    free(properties);
    
    return [propertyListArrM copy];
}

//獲取對(duì)象的所有方法

+ (NSArray *)loadAllMethods
{
    unsigned int methodCount =0;
    Method *methodList = class_copyMethodList([self class],&methodCount);
    NSMutableArray *methodsArrM = [NSMutableArray arrayWithCapacity:methodCount];
    
    for(int i = 0; i < methodCount; i++)
    {
        Method temp = methodList[i];
        const char *methodName = sel_getName(method_getName(temp));
        int arguments = method_getNumberOfArguments(temp);
        const char* encoding = method_getTypeEncoding(temp);
        NSLog(@"方法名:%@,參數(shù)個(gè)數(shù):%d,編碼方式:%@",[NSString stringWithUTF8String:methodName],arguments,[NSString stringWithUTF8String:encoding]);
        [methodsArrM addObject:[NSString stringWithUTF8String:methodName]];
    }
    free(methodList);
    return [methodsArrM copy];
}

@end

下面我們看輸出結(jié)果

//所有屬性列表輸出
2017-07-29 09:56:42.178020+0800 JJOC[6052:2093168] 屬性列表 = (
    number,
    arrM
)

//所有方法列表輸出
2017-07-29 09:56:42.178108+0800 JJOC[6052:2093168] 方法名:loadTimer,參數(shù)個(gè)數(shù):2,編碼方式:v16@0:8
2017-07-29 09:56:42.178141+0800 JJOC[6052:2093168] 方法名:arrM,參數(shù)個(gè)數(shù):2,編碼方式:@16@0:8
2017-07-29 09:56:42.178202+0800 JJOC[6052:2093168] 方法名:setArrM:,參數(shù)個(gè)數(shù):3,編碼方式:v24@0:8@16
2017-07-29 09:56:42.178266+0800 JJOC[6052:2093168] 方法名:.cxx_destruct,參數(shù)個(gè)數(shù):2,編碼方式:v16@0:8
2017-07-29 09:56:42.178314+0800 JJOC[6052:2093168] 方法名:viewDidLoad,參數(shù)個(gè)數(shù):2,編碼方式:v16@0:8
2017-07-29 09:56:42.178343+0800 JJOC[6052:2093168] 方法名:setupUI,參數(shù)個(gè)數(shù):2,編碼方式:v16@0:8
2017-07-29 09:56:42.178370+0800 JJOC[6052:2093168] 方法名:number,參數(shù)個(gè)數(shù):2,編碼方式:q16@0:8
2017-07-29 09:56:42.178396+0800 JJOC[6052:2093168] 方法名:setNumber:,參數(shù)個(gè)數(shù):3,編碼方式:v24@0:8q16
2017-07-29 09:56:42.178451+0800 JJOC[6052:2093168] 方法列表 = (
    loadTimer,
    arrM,
    "setArrM:",
    ".cxx_destruct",
    viewDidLoad,
    setupUI,
    number,
    "setNumber:"
)

??大家可以看見(jiàn)牧牢,所有屬性和方法都被打印了出來(lái)伯铣,這里大家會(huì)發(fā)現(xiàn)蜡感,屬性的settergetter系統(tǒng)默認(rèn)的方法也打印了出來(lái)犀斋,同時(shí)還有一個(gè)方法.cxx_destruct被打印了出來(lái)却舀,具體是什么我還沒(méi)有研究,歡迎知道的@我啡氢,謝謝大家袭艺。


參考文獻(xiàn)

1. Runtime 10種用法(沒(méi)有比這更全的了)
2. Runtime獲取類的屬性列表和方法列表

后記

未完,待續(xù)~~

海邊愜意
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绸吸,一起剝皮案震驚了整個(gè)濱河市叉存,隨后出現(xiàn)的幾起案子笨篷,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件归形,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)柿祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事罩扇。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辈讶。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上拙已,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好嫉到,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布惜辑。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纲堵,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音愚隧,去河邊找鬼。 笑死响委,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇救,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼徽千!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起露该,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暑中,失蹤者是張志新(化名)和其女友劉穎鲫剿,沒(méi)想到半個(gè)月后笆呆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫌套,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滋早。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片减细。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梅忌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出除破,到底是詐尸還是另有隱情牧氮,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布瑰枫,位于F島的核電站踱葛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尸诽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一甥材、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧性含,春花似錦洲赵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至究恤,卻和暖如春俭令,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背部宿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工抄腔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人理张。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓赫蛇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雾叭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悟耘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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