iOS-runtime之提綱挈領(lǐng)

要學(xué)習(xí)runtime,那就必須了解runtime是什么.runtime是運(yùn)行時(shí)機(jī)制
什么是runtime?
1> runtime是一套底層的C語言API(包含很多強(qiáng)大實(shí)用的C語言數(shù)據(jù)類型、C語言函數(shù))
2> 實(shí)際上,平時(shí)我們編寫的OC代碼,底層都是基于runtime實(shí)現(xiàn)的

  • 也就是說,平時(shí)我們編寫的OC代碼,最終都是轉(zhuǎn)成了底層的runtime代碼(C語言代碼)
    既然要學(xué)習(xí)runtime,那肯定要知道runtime有什么用
    runtime有啥用?
    1> 能動(dòng)態(tài)產(chǎn)生一個(gè)類、一個(gè)成員變量、一個(gè)方法
    2> 能動(dòng)態(tài)修改一個(gè)類、一個(gè)成員變量、一個(gè)方法
    3> 能動(dòng)態(tài)刪除一個(gè)類、一個(gè)成員變量、一個(gè)方法
    那么開發(fā)中怎么靈活的把runtime運(yùn)用到我們的項(xiàng)目中呢?
    首先我們需要導(dǎo)入頭文件 #import<objc/runtime.h>
    其次我們要熟悉runtime中的常用函數(shù)
    Ivar * class_copyIvarList : 獲得某個(gè)類內(nèi)部的所有成員變量
    Method * class_copyMethodList : 獲得某個(gè)類內(nèi)部的所有方法
    Method class_getInstanceMethod : 獲得某個(gè)實(shí)例方法(對(duì)象方法,減號(hào)-開頭)
    Method class_getClassMethod : 獲得某個(gè)類方法(加號(hào)+開頭)
    method_exchangeImplementations : 交換2個(gè)方法的具體實(shí)現(xiàn)

import: <objc/message.h>消息機(jī)制

objc_msgSend(....)
下面寫段個(gè)簡(jiǎn)單的代碼,讓大家感受一下runtime的強(qiáng)大


1-獲取某個(gè)類中所有方法

+ (void)getInstanceMethodList
{
NSMutableString *methodStr = [NSMutableString string];
// 獲取某個(gè)類中所有方法
// 獲取某個(gè)類中所有方法
// Class:獲取哪個(gè)類的方法
// outCount:類中方法總數(shù)
// class_copyMethodList:只能獲取當(dāng)前類
unsigned int count = 0;
// 獲取Method數(shù)組
Method *methodList = class_copyMethodList(self, &count);
for (int i = 0; i < count; i++) {
// 獲取方法
Method method = methodList[i];
// 獲取方法名
SEL sel = method_getName(method);
[methodStr appendFormat:@"\n%@\n",NSStringFromSelector(sel)];
}
NSLog(@"%@",methodStr);
}
+ (void)getClassMethodList
{
NSMutableString *methodStr = [NSMutableString string];
// 獲取某個(gè)類中所有方法
// 獲取某個(gè)類中所有方法
// Class:獲取哪個(gè)類的方法
// outCount:類中方法總數(shù)
// class_copyMethodList:只能獲取當(dāng)前類
unsigned int count = 0;
// 獲取類對(duì)象類名
NSString *className = NSStringFromClass(self);
// OC -> C .UTF8String
// 獲取元類
Class metaClass = objc_getMetaClass(className.UTF8String);
// 獲取Method數(shù)組
Method *methodList = class_copyMethodList(metaClass, &count);
for (int i = 0; i < count; i++) {
// 獲取方法
Method method = methodList[i];
// 獲取方法名
SEL sel = method_getName(method);
[methodStr appendFormat:@"\n%@\n",NSStringFromSelector(sel)];
}
NSLog(@"%@",methodStr);
}
@end


2-動(dòng)態(tài)的添加方法

//控制器中調(diào)用eat方法
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
Person *p = [[Person alloc] init];
// performSelector:調(diào)用未聲明方法
//    [p performSelector:@selector(eat)];
[p performSelector:@selector(eat:) withObject:@"213"];
// _cmd:當(dāng)前方法編號(hào),viewDidLoad
//    NSLog(@"%@ %@",self,NSStringFromSelector(_cmd));
}

內(nèi)部實(shí)現(xiàn)

@implementation Person
// 定義test的函數(shù),沒有返回值,參數(shù)(id,SEL)
// void:v id:@ SEL->:
void test(id self,SEL _cmd, NSString *str)
{
NSLog(@"自己添加方法%@",str);
}
// 只要調(diào)用了一個(gè)未實(shí)現(xiàn)方法,就會(huì)調(diào)用這個(gè)方法進(jìn)行處理
// sel:就是未實(shí)現(xiàn)方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
// [@"eat" isEqualToString:NSStringFromSelector(sel)]
// 判斷下是否是eat方法
if (sel == NSSelectorFromString(@"eat:")){
// 動(dòng)態(tài)添加eat方法
// class:給哪個(gè)類添加方法
// SEL:添加哪個(gè)方法
// IMP:方法實(shí)現(xiàn),函數(shù)名:函數(shù)入口
// types:添加的方法類型
class_addMethod(self, sel, (IMP)test, "v@:@");
return YES;
}
return [super resolveInstanceMethod:sel];
}

3.動(dòng)態(tài)的添加屬性

/*
給系統(tǒng)的類添加一個(gè)屬性,就需要使用runtime,設(shè)置關(guān)聯(lián).
NSObject類添加屬性
*/
- (void)setName:(NSString *)name
{
// 根本就沒有成員變量保存
//    _name = name;
// 設(shè)置關(guān)聯(lián)
// 如何保存變量
// object:給哪個(gè)對(duì)象添加屬性
// key:屬性名稱
// value:就是需要保存到對(duì)象中值
// policy:保存策略
objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name
{
// 獲取關(guān)聯(lián)
return objc_getAssociatedObject(self, "name");
//    return _name;
}

runtime還有很多強(qiáng)大的方法,大家有興趣可以自己慢慢摸索。這里就不再一一介紹了。

最后編輯于
?著作權(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,084評(píng)論 0 9
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 892評(píng)論 0 1
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,903評(píng)論 33 466
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡(jiǎn)介 Runt...
    樂樂的簡(jiǎn)書閱讀 2,251評(píng)論 0 9
  • 被生活工作壓的喘不過氣,心煩氣燥,不得平靜。 師:婚前是女兒,婚后是媳婦,女兒,妻子,母親。相比勞苦,難免。 一籌...
    菩提果zk張珂閱讀 227評(píng)論 0 1

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