国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

初涉Runtime(一)

2019-11-14 18:03:52
字體:
供稿:網(wǎng)友

Objective-C 是一門動態(tài)語言,有很多東西都是運行時才確定的。

比如這句代碼首先聲明testObject是一個NSString,然后創(chuàng)建了一個NSData對象,并且將這個對象的內(nèi)存地址保存在test Object中。運行的時候textObject只想的就是一個NSData對象。

NSString *testObject = [[NSData alloc]]init];

Runtime,是一套運行機制。是拿C語言一套比較底層的API,里面于很多很好很強大的方法。我們平寫的OC的代碼轉(zhuǎn)成Runtime進行實現(xiàn)。就像我們初始化一個對象的時候

OC :    [[Person alloc] init]        runtime :    objc_msgSend(objc_msgSend("Person" , "alloc"), "init")還有我們調(diào)用方法的時候,是這個樣子的    OC:        [object  method]    Runtime:        object_msgSend(obj,@selector(method));

既然Runtime是屬于OC的底層,name他就可以進行一些比較底層的操作。Objective-C能做的事情他能做,runtime能做的事情object-C就不一定能做到了,比如我們可以在程序運行的時候添加一個類,遍歷一個類的成員,或者為某一個類添加一個屬性,修改屬性值之類的操作。

下面我們就舉個例子用Runtime遍歷模型屬性,對屬性進行歸檔結(jié)檔操作。

第一步我們需要倒入相關(guān)的頭文件,運行時相關(guān)的頭文件一般都存放在頭文件的/objc,比較常用的<objc/runtime.h>,<objc/message>

1. 可以先做一個測試,我在控制器的viewDidLoad里面寫了一段代碼,

        - (void)viewDidLoad {            [super viewDidLoad];                        unsigned int count = 0;            Ivar *ivars = class_copyIvarList([SQKPerson class], &count);                        for (int i = 0; i<count; i++) {                // 取出i位置對應的成員變量                Ivar ivar = ivars[i];                                // 查看成員變量                const char *name = ivar_getName(ivar);                NSLog(@"%s", name);            }

打印的結(jié)果是

2015-10-28 22:47:41.186 runtime[2312:108141] _age2015-10-28 22:47:41.186 runtime[2312:108141] _height2015-10-28 22:47:41.186 runtime[2312:108141] _name

3. 創(chuàng)建一個Person的類,聲明了三個屬性,age,height,name。

////  SQKPerson.m//  runtime////  Created by SQK on 15/10/28.//  Copyright © 2015年 SQK. All rights reserved.//#import "SQKPerson.h"#import <objc/runtime.h>/** *  進行歸檔接檔,需要遵守NSCoding協(xié)議 */@interface SQKPerson ()<NSCoding>//在這里聲明了屬性@PRoperty (nonatomic, assign) int age;@property (nonatomic, assign) int height;@property (nonatomic, copy) NSString *name;@end@implementation SQKPerson- (void)encodeWithCoder:(NSCoder *)encode{    unsigned int count = 0;       Ivar *ivars = class_copyIvarList([SQKPerson class], &count);          for (int i = 0; i<count; i++) {         //獲取Ivars成員變量        Ivar ivar = ivars[i];        //需要將name轉(zhuǎn)成URTF8類型的        const char *name = ivar_getName(ivar);        NSString *key = [NSString stringWithUTF8String:name];        //歸檔        id value = [self valueForKey:key];        [encode encodeObject:value forKey:key];    }    //需要管理內(nèi)存    free(ivars);}-(instancetype)initWithCoder:(NSCoder *)decoder{        if (self= [super init]) {        unsigned int  count = 0;        Ivar *ivars = class_copyIvarList([SQKPerson class], &count);        for (int i = 0; i<count; i++) {        //取出對應的成員變量            Ivar ivar = ivars[i];            const char *name = ivar_getName(ivar);            //結(jié)檔            NSString *key = [NSString stringWithUTF8String:name];            //通過key取到成員變量(kvc)            id value = [decoder decodeObjectForKey:key];            //設(shè)置value到成員變量身上            [self setValue:value forKey:key];             }        free(ivars);    }    return self;}@end

如果我們模型中的屬性很多的話,那么用這種方法進行操作是很方便的。

 

總之,runtime是很強大的一套語言庫。在蘋果的官方文檔中也給出了詳細的文檔,對各種進行詳細的解釋

class_getName

class_addIvar

class_copyIvarList

class_getProperty

class_getPropertyList

....................

總而言之,Runtime是很好的一套東西,希望我們都能對他有所了解。我寫這東西也是一邊學一邊寫,難免避免有錯誤的見解。希望能和大家共同進步!

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 富川| 勃利县| 兴仁县| 龙江县| 泸溪县| 大石桥市| 黄梅县| 大名县| 张家界市| 资溪县| 荆州市| 崇左市| 永兴县| 邵阳市| 新丰县| 准格尔旗| 汾西县| 施秉县| 秀山| 建瓯市| 临洮县| 莲花县| 临澧县| 苍溪县| 周至县| 沂源县| 海宁市| 吕梁市| 大化| 达州市| 南召县| 九江县| 康乐县| 苏州市| 雅江县| 九龙城区| 武陟县| 聂荣县| 库车县| 广元市| 益阳市|