欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于iOS獲取屬性你真的了解嗎?

 更新時(shí)間:2017年12月30日 12:55:19   作者:FlyOceanFish 1 612  
這篇文章主要給大家介紹了關(guān)于iOS取屬性的相關(guān)資料,當(dāng)說到取屬性,相信很多的iOS開發(fā)者們會(huì)說出很多,但你就真的理解嗎?下面就來詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。

前言

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

指針

如果說到內(nèi)存,不知道大家會(huì)不會(huì)想到**指針**呢?這里簡(jiǎn)單介紹一下,讓大家有個(gè)簡(jiǎn)單的理解。如果理解不了的話,建議大家找一個(gè)C語言的教程,學(xué)一下指針。

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

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

 類型 * 變量名

這就是聲明了一個(gè)指針變量

 指針類型有什么作用呢?

比如:

int* num;

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

為什么會(huì)說連續(xù)操作多少個(gè)字節(jié)空間??主要是指針有算術(shù)運(yùn)算加減,說白了就是指針的移動(dòng)。

  • 指針是int* 連續(xù)操作4個(gè)字節(jié)
  • 指針是double* 連續(xù)操作8個(gè)字節(jié)

比如

int* p = #
p++;

當(dāng)指針+1的時(shí)候,這時(shí)候指針要移動(dòng)1個(gè)單元,而不是1個(gè)字節(jié)!!

那到底這1個(gè)單元是多大呢?其實(shí)1個(gè)單元的大小就是指針類型的大小。這里是`int`型,所以移動(dòng)了4個(gè)字節(jié)

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

以上就是簡(jiǎn)單給大家做了**指針**介紹,其實(shí)理解了指針,對(duì)于我們出現(xiàn)的一些野指針的bug、runtime源碼中的一些機(jī)制等等是有所幫助的。言歸正傳。接下來讓我看一道題,真正的去了解內(nèi)存和指針的關(guān)系。

int num1 = 10;
int num = 20;
int* p = #
p++;
printf("%d
",*p);//打印為10,因?yàn)閜++,指針已經(jīng)移動(dòng)了4個(gè)字節(jié),下一個(gè)內(nèi)存存儲(chǔ)10正好是4個(gè)字節(jié)

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

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

iOS中成員變量與屬性

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

下面代碼會(huì)? 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;
}
@end
int main(int argc, const char * argv[]) {
 @autoreleasepool {
 [[Test alloc] init];
 }
 return 0;
}

答案:代碼正常輸出,輸出結(jié)果為:

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

 為什么能夠正常運(yùn)行,并調(diào)用到speak方法?

計(jì)算機(jī)將我們的`Sark`類信息通過

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

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

為什么self.name會(huì)輸出?

我們程序在編譯之后其實(shí)就是一堆的匯編指令,匯編操作的就是**內(nèi)存地址**。所以當(dāng)我們程序運(yùn)行的時(shí)候都是**寄存器**一條條的執(zhí)行匯編指令。其實(shí)執(zhí)行匯編指令最重要的就是變量、方法、對(duì)象等等的一大堆地址,因?yàn)榧拇嫫饔邢?,所以?huì)把有限的數(shù)據(jù)從內(nèi)存中加載到寄存器。所以總得來說是操作寄存器的地址和內(nèi)存地址。如果沒有地址那怎么知道執(zhí)行什么呢?所以只要有地址了就好辦了。

指令如下圖:

變量對(duì)應(yīng)于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`就是變量的地址偏移字節(jié)。

變量地址=對(duì)象地址 + 基類大小 + ivar偏移字節(jié)

到這里再結(jié)合我上邊指針的鋪墊相信大家應(yīng)該明白了為什么為什self.name會(huì)輸出吧。

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

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);

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • iOS使用UIKeyInput自定義密碼輸入框的方法示例

    iOS使用UIKeyInput自定義密碼輸入框的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS如何使用UIKeyInput自定義密碼輸入框的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • iOS AFNetworking中cookie重定向代碼

    iOS AFNetworking中cookie重定向代碼

    這篇文章主要介紹了iOS AFNetworking中cookie重定向代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • IOS仿今日頭條滑動(dòng)導(dǎo)航欄

    IOS仿今日頭條滑動(dòng)導(dǎo)航欄

    今天仿今日頭條滑動(dòng)導(dǎo)航和網(wǎng)易首頁導(dǎo)航封裝類優(yōu)化相似,這個(gè)也是解決手勢(shì)沖突,UIPanGestureRecognizer與ScrollView的手勢(shì)沖突
    2016-01-01
  • IOS 實(shí)現(xiàn)搖一搖的操作

    IOS 實(shí)現(xiàn)搖一搖的操作

    這篇文章主要介紹了IOS 實(shí)現(xiàn)搖一搖的操作的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • iOS 底部按鈕和應(yīng)用圖標(biāo)顯示未讀消息(帶數(shù)字)

    iOS 底部按鈕和應(yīng)用圖標(biāo)顯示未讀消息(帶數(shù)字)

    本文主要介紹了iOS 底部按鈕和應(yīng)用圖標(biāo)顯示未讀消息的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼

    iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼

    這篇文章主要介紹了iOS10 適配遠(yuǎn)程推送功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS新版微信底部返回橫條問題的解決

    iOS新版微信底部返回橫條問題的解決

    這篇文章主要介紹了iOS新版微信底部返回橫條問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 深入了解iOS開發(fā)中UIWindow的相關(guān)使用

    深入了解iOS開發(fā)中UIWindow的相關(guān)使用

    這篇文章主要介紹了深入了解iOS開發(fā)中UIWindow的相關(guān)使用,以及iOS8以后產(chǎn)生的相關(guān)變化,需要的朋友可以參考下
    2015-10-10
  • iOS swift實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫的方法示例

    iOS swift實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫的方法示例

    在平時(shí)的iOS開發(fā)中,我們進(jìn)行界面跳轉(zhuǎn)時(shí)一般都是采用系統(tǒng)默認(rèn)的轉(zhuǎn)場(chǎng)動(dòng)畫,而下面這篇文章主要給大家介紹了關(guān)于iOS利用swift實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫的方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • iOS runtime知識(shí)梳理

    iOS runtime知識(shí)梳理

    本文主要對(duì)iOS runtime的知識(shí)進(jìn)行梳理。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01

最新評(píng)論