亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Runtime的介紹與簡單運用(一)

2019-11-09 18:32:46
字體:
來源:轉載
供稿:網友

runtime簡稱運行時

        我們都知道Object-C是一種是根據C語言所衍生出來的語言,因此我們的代碼在程序運行過程中都會被轉化成C代碼執行,而runtime就相當于這個橋梁,對于一個想要真正理解OC語言的人,學習runtime是必不可少的,好比想要深刻理解java,映射是必不可少一樣。

例如[objc logMyInfo];會被轉化成objc_msgSend(objc, @selector(logMyInfo));。

OC中一切都被設計成了對象,我們都知道一個類被初始化成一個實例,這個實例是一個對象。實際上一個類本質上也是一個對象,在runtime中用結構體表示。

例如導入#import <objc/runtime.h>我們可以從runtime中看到

/// An opaque type that rePResents a method in a class definition.描述類中的一個方法typedef struct objc_method *Method;/// An opaque type that represents an instance variable.實例變量typedef struct objc_ivar *Ivar;/// An opaque type that represents a category. 類別Categorytypedef struct objc_category *Category;/// An opaque type that represents an Objective-C declared property.類中聲明的屬性typedef struct objc_property *objc_property_t;//類在runtime中的表示struct objc_class {    Class isa  OBJC_ISA_AVAILABILITY;    //指針,顧名思義,表示是一個什么,    //實例的isa指向類對象,類對象的isa指向元類#if !__OBJC2__    //父類    Class super_class                                        OBJC2_UNAVAILABLE;    //類名    const char *name                                         OBJC2_UNAVAILABLE;    long version                                             OBJC2_UNAVAILABLE;    long info                                                OBJC2_UNAVAILABLE;    long instance_size                                       OBJC2_UNAVAILABLE;    //成員變量列表    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;    //方法列表    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;    //緩存  一種優化,調用過的方法存入緩存列表,下次調用先找緩存    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;    //協議列表    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;#endif    } OBJC2_UNAVAILABLE;

實戰應用,獲取類屬性列表

1、首先我們先新建一個工程,然后創建一個測試類文件TestClass.h

2、然后新建一些測試類屬性,代碼如下

h文件

#import <Foundation/Foundation.h>@protocol TestDelegate <NSObject>- (void)testDelegateMethod;@end@interface TestClass : NSObject@property (nonatomic,weak) id<TestDelegate> delegate;@property (nonatomic,strong) NSString *outPrOne;- (void)thisTestMethod;@end/** 測試代理 */@protocol TestDelegateTwo <NSObject>- (void)testDelegateMethodTwo;@end@interface TestClassTwo : NSObject@property (nonatomic,weak) id<TestDelegateTwo> delegateTwo;- (void)thisTestMethodTwo;@endm文件
#import "TestClass.h"@interface TestClass ()<TestDelegateTwo>@end@implementation TestClass{    NSString *instanceOne;    TestClassTwo *testTwo;}- (instancetype)init{    self = [super init];    if (self) {        testTwo.delegateTwo = self;    }    return self;}- (void)thisTestMethod{    if ([self.delegate respondsToSelector:@selector(testDelegateMethod)]) {        [self.delegate testDelegateMethod];    }    [testTwo thisTestMethodTwo];}- (void)testDelegateMethodTwo{    NSLog(@"thisTestMethodTwo");}@end@implementation TestClassTwo- (void)thisTestMethodTwo{    if ([self.delegateTwo respondsToSelector:@selector(testDelegateMethodTwo)]) {        [self.delegateTwo testDelegateMethodTwo];    }}@end 3、然后在viewController新建此類,進行測試,代碼如下

#import "ViewController.h"#import "TestClass.h"#import <objc/runtime.h>@interface ViewController ()<TestDelegate>@property (nonatomic,strong) TestClass *testClass;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    _testClass = [TestClass new];    _testClass.delegate = self;    unsigned int count;    //獲取屬性列表    objc_property_t *propertyList = class_copyPropertyList([_testClass class], &count);    for (int i=0; i<count; i++) {        const char *propertyName = property_getName(propertyList[i]);        NSLog(@"property---->%@", [NSString stringWithUTF8String:propertyName]);    }        //獲取方法列表    Method *methodList = class_copyMethodList([_testClass class], &count);    for (int i=0; i<count; i++) {        Method method = methodList[i];        NSLog(@"method---->%@", NSStringFromSelector(method_getName(method)));    }        //獲取成員變量列表    Ivar *ivarList = class_copyIvarList([_testClass class], &count);    for (int i=0; i<count; i++) {        Ivar myIvar = ivarList[i];        const char *ivarName = ivar_getName(myIvar);        NSLog(@"Ivar---->%@", [NSString stringWithUTF8String:ivarName]);    }    [_testClass thisTestMethod];    //獲取協議列表    __unsafe_unretained Protocol **protocolList = class_copyProtocolList([_testClass class], &count);    for (int i=0; i<count; i++) {        Protocol *myProtocal = protocolList[i];        const char *protocolName = protocol_getName(myProtocal);        NSLog(@"protocol---->%@", [NSString stringWithUTF8String:protocolName]);    }}- (void)testDelegateMethod{    NSLog(@"12111");}控制臺輸出如下

2017-02-06 18:34:39.920 RuntimeDemo[10997:466991] property---->innerPrOne2017-02-06 18:34:39.921 RuntimeDemo[10997:466991] property---->delegate2017-02-06 18:34:39.921 RuntimeDemo[10997:466991] property---->outPrOne2017-02-06 18:34:39.922 RuntimeDemo[10997:466991] property---->hash2017-02-06 18:34:39.922 RuntimeDemo[10997:466991] property---->superclass2017-02-06 18:34:39.923 RuntimeDemo[10997:466991] property---->description2017-02-06 18:34:39.923 RuntimeDemo[10997:466991] property---->debugDescription2017-02-06 18:34:39.924 RuntimeDemo[10997:466991] method---->testDelegateMethodTwo2017-02-06 18:34:39.925 RuntimeDemo[10997:466991] method---->thisTestMethod2017-02-06 18:34:39.926 RuntimeDemo[10997:466991] method---->outPrOne2017-02-06 18:34:39.926 RuntimeDemo[10997:466991] method---->setOutPrOne:2017-02-06 18:34:39.927 RuntimeDemo[10997:466991] method---->innerPrOne2017-02-06 18:34:39.927 RuntimeDemo[10997:466991] method---->setInnerPrOne:2017-02-06 18:34:39.928 RuntimeDemo[10997:466991] method---->.cxx_destruct2017-02-06 18:34:39.928 RuntimeDemo[10997:466991] method---->setDelegate:2017-02-06 18:34:39.929 RuntimeDemo[10997:466991] method---->delegate2017-02-06 18:34:39.929 RuntimeDemo[10997:466991] method---->init2017-02-06 18:34:39.930 RuntimeDemo[10997:466991] Ivar---->instanceOne2017-02-06 18:34:39.931 RuntimeDemo[10997:466991] Ivar---->testTwo2017-02-06 18:34:39.931 RuntimeDemo[10997:466991] Ivar---->_delegate2017-02-06 18:34:39.932 RuntimeDemo[10997:466991] Ivar---->_outPrOne2017-02-06 18:34:39.932 RuntimeDemo[10997:466991] Ivar---->_innerPrOne2017-02-06 18:34:39.933 RuntimeDemo[10997:466991] 121112017-02-06 18:34:39.933 RuntimeDemo[10997:466991] protocol---->TestDelegateTwo由此可知此類所有屬性與方法,以及該類所遵守的協議在下一篇文章我們將介紹如何運用Runtime進行方法攔截


上一篇:ADB命令的使用

下一篇:integer綜合分析

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久6免费高清热精品| 97在线视频一区| 亚洲最大福利视频网| 亚洲性av网站| 亚洲人a成www在线影院| 成人午夜在线观看| 欧美美女操人视频| 亚洲欧美中文在线视频| 国产精品免费久久久久久| 亚洲免费人成在线视频观看| 亚洲片国产一区一级在线观看| 欧美成人激情图片网| 一区二区三区国产视频| 欧美性猛交视频| 中文字幕久久亚洲| 亚洲男人天堂视频| 亚洲男人7777| 色综合天天综合网国产成人网| 日韩免费在线电影| 成人欧美一区二区三区黑人| 欧美日韩在线视频首页| 欧美精品在线第一页| 欧美黑人xxxⅹ高潮交| 亚洲午夜未删减在线观看| 亚洲综合中文字幕在线观看| 777午夜精品福利在线观看| 日韩欧美在线第一页| 亚洲视频在线观看免费| 亚洲成av人乱码色午夜| 亚洲欧洲在线看| 91黑丝在线观看| 色偷偷888欧美精品久久久| 国模吧一区二区三区| 午夜美女久久久久爽久久| 欧美在线一区二区三区四| 1769国内精品视频在线播放| 亚洲性视频网址| 午夜精品三级视频福利| 91麻豆桃色免费看| 亚洲免费视频网站| 91久久精品久久国产性色也91| 精品久久久久久国产| 成人国产精品一区二区| 亚洲国产精品久久久久秋霞蜜臀| 奇米一区二区三区四区久久| 爱福利视频一区| 在线视频亚洲欧美| 97在线看福利| 久99九色视频在线观看| 国产精品高潮呻吟久久av野狼| 国产精品精品久久久久久| 日韩av手机在线看| 国产精品白丝jk喷水视频一区| 精品丝袜一区二区三区| 亚洲精品wwwww| 欧美性xxxx极品hd欧美风情| 日韩av在线看| 亚洲国产精品电影| 亚洲天堂开心观看| 日韩在线高清视频| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲一区二区久久| 中文字幕久热精品在线视频| www.日韩系列| 91在线观看免费高清完整版在线观看| 亚洲欧美色图片| 97成人超碰免| 国产精品久久久久久久电影| 97色在线播放视频| 中文字幕免费国产精品| 亚洲午夜国产成人av电影男同| 97视频在线观看免费| 亚洲乱亚洲乱妇无码| 欧美老女人www| 亚洲精品国产拍免费91在线| 国产精品亚洲一区二区三区| 欧美韩日一区二区| 国产精品久久久久久久久| 欧美性高潮床叫视频| 午夜精品一区二区三区在线播放| 91精品国产色综合久久不卡98口| 日韩有码在线电影| 欧美日韩国产在线播放| 日韩精品在线免费| 亚洲国产精品va在线看黑人动漫| 92看片淫黄大片看国产片| 国产视频久久久| 国产精品99一区| 国产精品美女免费看| 美日韩精品免费视频| 国产精品日韩一区| 91爱视频在线| 亚洲国产中文字幕久久网| 色婷婷av一区二区三区久久| 亚洲va电影大全| 亚洲国产精品va在线观看黑人| 亚洲色图17p| 日韩精品极品在线观看播放免费视频| 日韩av在线精品| 亚洲人精选亚洲人成在线| 日韩欧美aⅴ综合网站发布| 欧美激情第99页| 国产精品wwwwww| 国产精品视频网| 伊人久久久久久久久久| 97精品一区二区三区| 中国china体内裑精亚洲片| 午夜精品一区二区三区在线播放| 久久国产精品电影| 国产精品美女无圣光视频| 国产成人avxxxxx在线看| 日韩美女av在线| 亚洲人精选亚洲人成在线| 国产成人在线亚洲欧美| 欧美性猛交xxxx免费看漫画| 91夜夜未满十八勿入爽爽影院| 尤物99国产成人精品视频| 亚洲视频国产视频| 日韩色av导航| 尤物精品国产第一福利三区| 亚洲一区二区在线播放| 亚洲伊人久久大香线蕉av| 国产精品一区二区久久国产| 国产一区二区三区久久精品| 国产成人精品久久| 亚洲国产成人精品久久| 久久精品91久久香蕉加勒比| 一区二区三区www| 欧美精品在线免费| 91av视频在线播放| 亚洲一区美女视频在线观看免费| 亚洲的天堂在线中文字幕| 8090成年在线看片午夜| 国产精品va在线播放我和闺蜜| 国产成人精品国内自产拍免费看| 精品日本高清在线播放| 青青久久aⅴ北条麻妃| 色琪琪综合男人的天堂aⅴ视频| 欧美日韩一区二区免费视频| 欧美日韩免费区域视频在线观看| 国产成人涩涩涩视频在线观看| 日本精品一区二区三区在线播放视频| 7m第一福利500精品视频| 国外成人在线播放| 欧美性色视频在线| 插插插亚洲综合网| 一区二区三区视频免费在线观看| 国产在线精品成人一区二区三区| 亚洲国内精品视频| 欧美视频专区一二在线观看| 亚洲激情视频网站| 亚洲欧美国产一本综合首页| 国产ts一区二区| xxxx欧美18另类的高清| 伦伦影院午夜日韩欧美限制| 色偷偷偷亚洲综合网另类| 亚洲欧美999| 最新日韩中文字幕| 亚洲一区二区三区在线免费观看| 日本免费一区二区三区视频观看| 亚洲综合视频1区| 欧美整片在线观看| 亚洲男人的天堂在线| 欧美国产第二页|