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

首頁 > 系統 > iOS > 正文

關于iOS獲取屬性你真的了解嗎?

2019-10-21 18:42:35
字體:
來源:轉載
供稿:網友

前言

屬性對各位iOS開發者來說應該都不陌生,如果iOS中談到取屬性,相信大家都會夸夸其談,不就是get方法嗎?或者大談kvc取屬性的機制。不得不說這些也是對的。這時大家可能就疑惑了,那你還要說啥的!!大家不妨想想,這些都是代碼層的實現,其實我們的代碼最終都會被編譯,然后加載到內存中,那你在內存中是怎么取到屬性的呢??對的我們討論就是它!下面話不多說了,來一起看看詳細的介紹吧。

指針

如果說到內存,不知道大家會不會想到**指針**呢?這里簡單介紹一下,讓大家有個簡單的理解。如果理解不了的話,建議大家找一個C語言的教程,學一下指針。

指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。由于通過地址能找到所需的變量單元,可以說,地址指向該變量單元。因此,將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。

*那到底什么是指針呢??

 類型 * 變量名

這就是聲明了一個指針變量

 指針類型有什么作用呢?

比如:

int* num;

指針變量的類型決定了通過這個指針找到變量的首地址以后,連續操作多少個字節空間

為什么會說連續操作多少個字節空間??主要是指針有算術運算加減,說白了就是指針的移動。

  • 指針是int* 連續操作4個字節
  • 指針是double* 連續操作8個字節

比如

int* p = #p++;

當指針+1的時候,這時候指針要移動1個單元,而不是1個字節?。?/p>

那到底這1個單元是多大呢?其實1個單元的大小就是指針類型的大小。這里是`int`型,所以移動了4個字節

-------------------------------------------------------------------------------------------

以上就是簡單給大家做了**指針**介紹,其實理解了指針,對于我們出現的一些野指針的bug、runtime源碼中的一些機制等等是有所幫助的。言歸正傳。接下來讓我看一道題,真正的去了解內存和指針的關系。

int num1 = 10;int num = 20;int* p = #p++;printf("%d",*p);//打印為10,因為p++,指針已經移動了4個字節,下一個內存存儲10正好是4個字節

這里其實是前邊聲明了一個num1,正好是4個字節,所以就將10取出來了。(說白了就是內存中下一個連續的4個字節存的是什么取出來就是什么)

說了這么多都是指針和內存,建議大家搞明白以上內容再讀以下的內容,如果上邊都搞不明白的話,下邊有關iOS中runtime取屬性的內容有可能就會云里霧里。

iOS中成員變量與屬性

以下題目是sunnyxx習題中的一題,網上也有詳細的[答案](http://blog.csdn.net/shznt/article/details/50481819)。這里作者就簡述一下自己的理解,如果想看非常詳細的答案的話可以點擊上邊的鏈接。

下面代碼會? Compile Error / Runtime Crash / NSLog…?

@interface Sark : NSObject@property (nonatomic, copy) NSString *name;@end@implementation Sark- (void)speak{ NSLog(@"my name is %@", self.name);}@end@interface Test : NSObject@end@implementation Test- (instancetype)init{ self = [super init]; if (self) { id cls = [Sark class]; void *obj = &cls; [(__bridge id)obj speak]; } return self;}@endint main(int argc, const char * argv[]) { @autoreleasepool { [[Test alloc] init]; } return 0;}

答案:代碼正常輸出,輸出結果為:

2014-11-07 14:08:25.698 Test[1097:57255] my name is

 為什么能夠正常運行,并調用到speak方法?

計算機將我們的`Sark`類信息通過

`id cls = [Sark class];`這一行加載到內存中,并且取得了`cls`變量。這個時候其實我們只要知道`cls`這個變量的地址就行了,其實相當于類的對象的地址。`void *obj = &cls;`這句話就讓我們獲得了對象的地址。(平時我們`new`對象的時候就干了兩件事:1、申請內存;2、獲取內存的地址(對象變量的地址就是內存的地址),這里的對象與我們`new`出來的對象有所不同。但是雖然不是new對象,iOS中`Class`對象已經存儲了我們需要的東西。比如有關變量的內存**偏移**、方法等等所有的信息)接下來可以干我們想干的任何事情了。

>iOS中`Class`中存儲了我們想要的東西,這一塊的知識要上升到了runtime的源碼,上邊給到的鏈接中有詳細介紹。其實大家想想編譯完之后肯定得有一個類或者其他東西存儲著有關內存等等相關的信息的。

為什么self.name會輸出?

我們程序在編譯之后其實就是一堆的匯編指令,匯編操作的就是**內存地址**。所以當我們程序運行的時候都是**寄存器**一條條的執行匯編指令。其實執行匯編指令最重要的就是變量、方法、對象等等的一大堆地址,因為寄存器有限,所以會把有限的數據從內存中加載到寄存器。所以總得來說是操作寄存器的地址和內存地址。如果沒有地址那怎么知道執行什么呢?所以只要有地址了就好辦了。

指令如下圖:

ios,獲取屬性值,獲取所有屬性,獲取屬性列表

變量對應于runtime的objc_ivar代碼如下:

struct objc_ivar { char *ivar_name      OBJC2_UNAVAILABLE; char *ivar_type      OBJC2_UNAVAILABLE; int ivar_offset      OBJC2_UNAVAILABLE;#ifdef __LP64__ int space      OBJC2_UNAVAILABLE;#endif}

其中 `ivar_offset`就是變量的地址偏移字節。

變量地址=對象地址 + 基類大小 + ivar偏移字節

到這里再結合我上邊指針的鋪墊相信大家應該明白了為什么為什self.name會輸出吧。

其實通過這里我們也知道了其實iOS中取對象就是指針的偏移。

Student *student = [[Student alloc] init]; Ivar age_ivar = class_getInstanceVariable(object_getClass(student), "age"); int *age_pointer = (int *)((__bridge void *)(student) + ivar_getOffset(age_ivar)); NSLog(@"age ivar offset = %td", ivar_getOffset(age_ivar)); *age_pointer = 10; NSLog(@"%@", student);

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
动漫精品一区二区| 欧美最猛黑人xxxx黑人猛叫黄| 国产极品精品在线观看| 日韩欧美主播在线| 91国内精品久久| 亚洲直播在线一区| www.国产精品一二区| 欧美精品成人在线| 成人国产精品一区| 国产精品一区二区女厕厕| 日韩av电影在线免费播放| 欧美寡妇偷汉性猛交| 国外成人在线视频| 亚洲日本中文字幕免费在线不卡| 国产精品久久97| 国产精品久在线观看| 久久国产加勒比精品无码| 国产在线日韩在线| 美女视频久久黄| 国产精品香蕉在线观看| 日韩福利在线播放| 亚洲欧美日韩国产精品| 日韩电影网在线| 欧美一级免费看| 欧美一区二粉嫩精品国产一线天| 久久亚洲精品中文字幕冲田杏梨| 在线播放日韩av| 国内精品久久久久影院 日本资源| 日韩女优人人人人射在线视频| 亚洲欧美国产另类| 欧美激情videos| 麻豆国产精品va在线观看不卡| 中文字幕欧美精品日韩中文字幕| 91精品视频大全| 久久久久久噜噜噜久久久精品| 久久成人av网站| 欧美一区二区三区免费视| 色婷婷av一区二区三区久久| 欧美韩日一区二区| 国产激情视频一区| 成人激情在线播放| 亚洲电影免费在线观看| 久久中文精品视频| 精品福利樱桃av导航| 久久99热这里只有精品国产| 久久中文字幕在线视频| 一区二区三区日韩在线| 欧美整片在线观看| 在线观看欧美www| 成人美女免费网站视频| 高清欧美性猛交xxxx| 精品丝袜一区二区三区| 国产91成人在在线播放| 国产一区二区三区在线视频| 日韩一区二区三区xxxx| 久久久久中文字幕2018| 亚洲毛片在线免费观看| 国产视频丨精品|在线观看| 国产欧美va欧美va香蕉在| 日韩中文在线中文网三级| 5252色成人免费视频| 亚洲精品日产aⅴ| 日本精品一区二区三区在线| 欧美美女18p| 欧美日韩亚洲网| 亚洲色图在线观看| 精品国产乱码久久久久酒店| 久久影院资源站| 日韩在线观看高清| 久久亚洲综合国产精品99麻豆精品福利| 亚洲欧美日韩一区二区在线| 国产精品v日韩精品| 欧美色xxxx| 日韩高清有码在线| 538国产精品视频一区二区| 日韩av色综合| 欧美电影免费在线观看| 久久视频国产精品免费视频在线| 国产精品美女在线| 国产精品久久久久999| 法国裸体一区二区| 亚洲自拍在线观看| 欧美激情亚洲激情| 欧美激情欧美狂野欧美精品| 92裸体在线视频网站| 97在线免费视频| 久久成人国产精品| 国产精品免费电影| 国产精品视频专区| 亚洲免费高清视频| 成人综合国产精品| 中文字幕亚洲综合久久筱田步美| 亚洲欧美中文字幕在线一区| 午夜精品一区二区三区在线视频| 亚洲欧美国产精品va在线观看| 欧美最顶级丰满的aⅴ艳星| 亚洲国内精品视频| 国色天香2019中文字幕在线观看| 美女精品视频一区| 国产亚洲福利一区| 亚洲韩国日本中文字幕| 日日骚久久av| 国产精品久久久久久久app| 亚洲精品国产精品国自产观看浪潮| 欧美高清视频一区二区| 欧美成人在线免费视频| 欧美黄色性视频| 国产精品久在线观看| 黄网动漫久久久| 亚洲永久在线观看| 亚洲电影免费观看高清| 亚洲激情在线视频| 91中文字幕在线| 亚洲社区在线观看| 欧美日韩一区二区在线| 日韩在线观看成人| 国产精品电影久久久久电影网| 在线日韩日本国产亚洲| 最好看的2019的中文字幕视频| 国产成人综合精品在线| 成人亚洲欧美一区二区三区| 亚洲精品综合久久中文字幕| 日本成人在线视频网址| 亚洲国产精品久久精品怡红院| 亚洲欧美视频在线| 久久精品国产久精国产一老狼| 亚洲精品美女网站| 91丨九色丨国产在线| 日韩欧美精品在线观看| 亚洲一区二区自拍| 亚洲成av人影院在线观看| 亚洲国产成人精品女人久久久| 欧美老女人bb| 国产精品视频久久久| 97国产精品视频| 国产日韩精品在线观看| 国产精品青草久久久久福利99| 色综合导航网站| 亚洲精品久久久久久久久久久久久| 成人性生交大片免费看视频直播| 亚洲女在线观看| 97视频国产在线| 91色在线视频| 欧美日韩国产色| 亚洲亚裔videos黑人hd| 久久精品99国产精品酒店日本| 亚洲精品少妇网址| 亚洲国产私拍精品国模在线观看| 欧美日韩一区二区三区| 国产精品麻豆va在线播放| 欧美亚洲另类激情另类| 日韩中文在线中文网三级| 欧美激情视频网| 黑人巨大精品欧美一区免费视频| 欧美成人黑人xx视频免费观看| 国产精品日韩专区| 久久成人人人人精品欧| 国产成人在线视频| 北条麻妃在线一区二区| 亚洲第一福利视频| 九九热这里只有精品6| 国产精品高潮呻吟久久av无限| 国产一区二区久久精品| 91国产美女在线观看|