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),它的強(qiáng)大之處是實現(xiàn)方法可以在別的類中,只要和class_addMethod指定的方法名相同即可

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

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

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

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