runtime的基本使用

OC語言是基于C語言進(jìn)行封裝的一種面向?qū)ο蟮恼Z言,因此OC的底層就是C,runtime則是用來鏈接OC與C绪杏,用C語言寫的一個庫,完成OC所不能完成的事,

以下是Runtime中比較常用的一些方法:
Ivar *class_copyIvarList(Class cls, unsigned int *outCount) //獲取所有成員變量
const char *ivar_getName(Ivar v) 獲取某個成員變量的名字
const char *ivar_getTypeEncoding(Ivar v) //獲取某個成員變量的類型編碼
Ivar class_getInstanceVariable(Class cls, const char *name) //獲取某個類中指定名稱的成員變量
id object_getIvar(id obj, Ivar ivar) //獲取某個對象中的某個成員變量的值
void object_setIvar(id obj, Ivar ivar, id value) //設(shè)置某個對象的某個成員變量的值
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) //為某個類關(guān)聯(lián)某個對象
id objc_getAssociatedObject(id object, const void *key) //獲取到某個類的某個關(guān)聯(lián)對象
void objc_removeAssociatedObjects(id object) //移除已經(jīng)關(guān)聯(lián)的對象

在OC中尖啡,給一個類添加方法和可以使用延展,但使用延展的方法通常只能在本類中使用剩膘,在外界就訪問不到了衅斩,如何才能在其他類中也使用這個類的私有方法和屬性呢?
首先必須導(dǎo)入#import <objc/runtime.h>

//編碼
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    unsigned int outCount;
    Ivar *ivarList = class_copyIvarList([Person class], &outCount);
    for (NSInteger i = 0; i < outCount; i++) {
        const char *cName = ivar_getName(ivarList[i]);
        NSString *name = [NSString stringWithUTF8String:cName];
        [aCoder encodeObject:[self valueForKey:name] forKey:name];
    }
}
//解碼
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        unsigned int outCount;
        Ivar *ivarList = class_copyIvarList([Person class], &outCount);
        for (NSInteger i = 0; i < outCount; i ++) {
            const char *cName = ivar_getName(ivarList[i]);
            NSString *name = [NSString stringWithUTF8String:cName];
            [self setValue:[aDecoder decodeObjectForKey:name] forKey:name];
        }
        
    }
    return self;
}
- (NSString *)description
{
    /**
     *  class:要獲取的類名
     *  @param outCount 通過這一個函數(shù)執(zhí)行之后會將成員變量的個數(shù)賦值到此
     *  int *  char * 表示int,char數(shù)組
     */
    unsigned int outCount;
    //獲取到所有的成員變量
    Ivar *ivarList = class_copyIvarList([Person class], &outCount);
    for (NSInteger i = 0; i < outCount; i++) {
        //每次獲取一個成員變量
        Ivar ivar = ivarList[i];
        //獲取成員變量的名字和類型編碼
        NSLog(@"name = %s,type = %s",ivar_getName(ivar),ivar_getTypeEncoding(ivar));
    }
    return nil;
}

然后在外界就可以使用這個類里面的屬性和方法了
有時候援雇,調(diào)用值申明沒有實現(xiàn)的方法就會造成了程序Cresh矛渴,runtime中提供了了幾個方法來避免這一問題
1 + resolveInstanceMethod:(SEL)sel // 為一個實例方法動態(tài)添加實現(xiàn) + resolveClassMethod:(SEL)sel // 為一個類方法動態(tài)添加實現(xiàn)
2 - (id)forwardingTargetForSelector:(SEL)aSelector
//為沒有實現(xiàn)的方法指定一個對象
3 - (void)forwardInvocation:(NSInvocation *)anInvocation
//子類重載這個方法為消息指定其他對象
比如我在.h中定義了walkOnTheStreet:這個方法椎扬,但是并沒有在.m中實現(xiàn)惫搏,那可以調(diào)用使用以上幾個方法來添加實現(xiàn)

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    NSString *selString = NSStringFromSelector(sel);
    if ([selString isEqualToString:@"walkOnTheStreet:"]) {
            為一個沒有實現(xiàn)的方法動態(tài)添加實現(xiàn)
            cls:類
            IMP:要添加的實現(xiàn)
            types:動態(tài)添加的實現(xiàn)的類型編碼
 
        class_addMethod(self, @selector(walkOnTheStreet:), (IMP)walkFunc, "V@:@");
    }
    return [super resolveInstanceMethod:sel];
}

有了這個方法,即使我們在viewDidLoad中調(diào)用沒實現(xiàn)的方法也不會Cresh蚕涤,runtime會幫我們實現(xiàn)筐赔,它的強大之處是實現(xiàn)方法可以在別的類中,只要和class_addMethod指定的方法名相同即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揖铜,一起剝皮案震驚了整個濱河市茴丰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖贿肩,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峦椰,死亡現(xiàn)場離奇詭異,居然都是意外死亡汰规,警方通過查閱死者的電腦和手機(jī)汤功,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溜哮,“玉大人滔金,你說我怎么就攤上這事∶ぃ” “怎么了餐茵?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長述吸。 經(jīng)常有香客問我忿族,道長,這世上最難降的妖魔是什么蝌矛? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任肠阱,我火速辦了婚禮,結(jié)果婚禮上朴读,老公的妹妹穿的比我還像新娘屹徘。我一直安慰自己,他們只是感情好衅金,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布噪伊。 她就那樣靜靜地躺著,像睡著了一般氮唯。 火紅的嫁衣襯著肌膚如雪鉴吹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天惩琉,我揣著相機(jī)與錄音豆励,去河邊找鬼。 笑死瞒渠,一個胖子當(dāng)著我的面吹牛良蒸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伍玖,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫩痰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窍箍?” 一聲冷哼從身側(cè)響起串纺,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丽旅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纺棺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榄笙,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年祷蝌,在試婚紗的時候發(fā)現(xiàn)自己被綠了办斑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡杆逗,死狀恐怖乡翅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罪郊,我是刑警寧澤蠕蚜,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站悔橄,受9級特大地震影響靶累,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癣疟,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一挣柬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睛挚,春花似錦邪蛔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淤击,卻和暖如春匠抗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背污抬。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工汞贸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人印机。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓矢腻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耳贬。 傳聞我的和親對象是個殘疾皇子踏堡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉猎唁,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言咒劲,那么這個「動態(tài)」表現(xiàn)在哪呢顷蟆?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評論 0 7
  • 對于從事 iOS 開發(fā)人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,721評論 7 64
  • 今日小確幸:久違的太陽 【大姐不知道】 思維導(dǎo)圖課程-趁早職場季 【運動】 shape321腰腹 手臂訓(xùn)練60*1...
    小尾巴巨人閱讀 165評論 0 0
  • cell可自由拖動的flowlayout類善良登場 我是CollectionViewCell腐魂,看名字就知道我和Co...
    莫道別離傷閱讀 380評論 0 1