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

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

初涉Runtime(一)

2019-11-14 18:03:52
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

第一步我們需要倒入相關的頭文件,運行時相關的頭文件一般都存放在頭文件的/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);            }

打印的結果是

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. 創建一個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協議 */@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轉成URTF8類型的        const char *name = ivar_getName(ivar);        NSString *key = [NSString stringWithUTF8String:name];        //歸檔        id value = [self valueForKey:key];        [encode encodeObject:value forKey:key];    }    //需要管理內存    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);            //結檔            NSString *key = [NSString stringWithUTF8String:name];            //通過key取到成員變量(kvc)            id value = [decoder decodeObjectForKey:key];            //設置value到成員變量身上            [self setValue:value forKey:key];             }        free(ivars);    }    return self;}@end

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

 

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

class_getName

class_addIvar

class_copyIvarList

class_getProperty

class_getPropertyList

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

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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区中文字幕| 国外成人免费在线播放| 欧美成人一二三| 日韩av手机在线观看| 国产精品视频一区二区高潮| 亚洲免费一级电影| 伊人久久大香线蕉av一区二区| 久久免费成人精品视频| 亚洲女人天堂视频| 伊人久久免费视频| 日韩二区三区在线| 亚洲电影第1页| 日韩av网站在线| 亚洲国产精品推荐| 丝袜一区二区三区| 欧美在线观看网址综合| 亚洲视频一区二区三区| 日韩日本欧美亚洲| 亚洲午夜未删减在线观看| 日韩在线不卡视频| 亚洲国产成人一区| 久久躁日日躁aaaaxxxx| 日本久久久久久| 日韩美女免费观看| 在线观看亚洲区| 狠狠躁天天躁日日躁欧美| 亚洲国产另类久久精品| 久久99精品视频一区97| 最近2019中文字幕mv免费看| 久久精品国产成人| 欧美洲成人男女午夜视频| 日韩日本欧美亚洲| 国产精品久久久久久久久男| 欧美富婆性猛交| 国产精品久久色| 日韩视频在线免费观看| 91精品国产自产在线| 久久精品视频在线| 久久91亚洲精品中文字幕奶水| 久久99国产精品久久久久久久久| 成人欧美在线视频| 久久久久久久网站| 久久久精品免费| 国产精品女主播| 中文字幕一区二区三区电影| 久久的精品视频| 激情懂色av一区av二区av| 欧美最猛性xxxxx亚洲精品| 色综合天天综合网国产成人网| 欧美放荡办公室videos4k| 97欧美精品一区二区三区| 欧美激情精品久久久久久变态| 91九色国产社区在线观看| 国产日韩av在线| 亚洲第一网中文字幕| 中文国产成人精品久久一| 日韩欧美在线第一页| 日韩性xxxx爱| 国产精品7m视频| 色午夜这里只有精品| 亚洲女同性videos| 成人黄色生活片| 777777777亚洲妇女| 97超级碰在线看视频免费在线看| 伊人激情综合网| 亚洲精品wwwww| 欧洲美女免费图片一区| 在线视频国产日韩| 欧美乱大交xxxxx另类电影| 色99之美女主播在线视频| 97视频国产在线| 亚洲精品在线不卡| 精品中文字幕在线2019| 亚洲二区在线播放视频| 91精品久久久久久综合乱菊| 成人h视频在线观看播放| 欧美影院在线播放| 精品伊人久久97| 欧美日韩综合视频网址| 日韩中文理论片| www.99久久热国产日韩欧美.com| 国产精品视频久| 97精品国产97久久久久久免费| 精品久久久av| 欧美猛男性生活免费| 91大神福利视频在线| 亚洲性日韩精品一区二区| 欧美成人精品不卡视频在线观看| 久久久久久久久久久亚洲| 久久精品2019中文字幕| 亚洲91精品在线观看| 欧美成人四级hd版| 黑人巨大精品欧美一区二区免费| 色偷偷偷综合中文字幕;dd| 亚洲人成网站在线播| 九九热精品视频在线播放| 中文字幕亚洲专区| 亚洲精品国产精品久久清纯直播| 91精品中文在线| 日韩最新免费不卡| 欧美成人精品h版在线观看| 亚洲伊人久久综合| 红桃av永久久久| 18性欧美xxxⅹ性满足| 日韩中文字幕在线看| 国产精品欧美一区二区三区奶水| 欧美国产中文字幕| 精品国产一区二区三区在线观看| 在线不卡国产精品| 在线亚洲午夜片av大片| 日韩精品在线影院| 国产一区二区三区网站| 亚洲精品美女在线观看播放| 亚洲成年人在线播放| 91成人国产在线观看| 久久综合久久88| 国产mv免费观看入口亚洲| 久久这里只有精品视频首页| 97色在线观看免费视频| 欧美午夜性色大片在线观看| 亚洲精品国产欧美| 国产精品久久久久久久app| 668精品在线视频| 26uuu另类亚洲欧美日本老年| 亚洲国产精品大全| 日韩精品久久久久久久玫瑰园| 欧美午夜视频一区二区| 国产日韩欧美中文| 中文字幕亚洲一区二区三区五十路| 亚洲国产成人精品久久| 国产精品男人的天堂| 欧美乱大交做爰xxxⅹ性3| 国产精品jvid在线观看蜜臀| 亚洲欧美成人网| 国产成人激情小视频| 国产亚洲aⅴaaaaaa毛片| 国产欧美婷婷中文| 亚洲美女av在线| 国产亚洲精品综合一区91| 欧洲成人在线视频| 一本大道香蕉久在线播放29| 亚洲高清在线观看| 国产亚洲精品久久久久久777| 欧美国产日韩中文字幕在线| 在线成人激情视频| 青青久久av北条麻妃海外网| 国产综合在线看| 色偷偷噜噜噜亚洲男人的天堂| 青草成人免费视频| 久久精品成人动漫| 久久久视频精品| 国产福利视频一区| 精品国产鲁一鲁一区二区张丽| 91精品国产乱码久久久久久蜜臀| 久久最新资源网| 国产精品日韩欧美| 亚洲天堂一区二区三区| 国产不卡视频在线| 成人激情综合网| 久久全球大尺度高清视频| 久久久久这里只有精品| 欧美精品在线免费观看| 热99久久精品| 国产精品福利网站|