最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS源碼閱讀必備知識之Tagged Pointer

 更新時間:2018年07月11日 15:04:39   作者:Dexterxiee  
這篇文章主要給大家介紹了關(guān)于iOS源碼閱讀必備知識之Tagged Pointer的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Tagged Pointer 介紹

蘋果對于Tagged Pointer特點的介紹:

  • Tagged Pointer專門用來存儲小的對象,例如NSNumber和NSDate
  • Tagged Pointer指針的值不再是地址了,而是真正的值。所以,實際上它不再是一個對象了,它只是一個披著對象皮的普通變量而已。所以,它的內(nèi)存并不存儲在堆中,也不需要malloc和free。
  • 在內(nèi)存讀取上有著3倍的效率,創(chuàng)建時比以前快106倍。

為什么要引入Tagged Pointer

iPhone5s 采用64位處理器。對于64位程序,我們的數(shù)據(jù)類型的長度是跟CPU的長度有關(guān)的。

這樣就導(dǎo)致了 一些對象占用的內(nèi)存會翻倍。

同時 維護程序中的對象需要 分配內(nèi)存,維護引用計數(shù),管理生命周期,使用對象給程序的運行增加了負擔(dān)。

Tagged Pointer

為了改進上面提到的內(nèi)存占用和效率問題,蘋果提出了Tagged Pointer對象。由于NSNumber、NSDate一類的變量本身的值需要占用的內(nèi)存大小常常不需要8個字節(jié),拿整數(shù)來說,4個字節(jié)所能表示的有符號整數(shù)就可以達到20多億(注:2^31=2147483648,另外1位作為符號位),對于絕大多數(shù)情況都是可以處理的。

我們可以將一個對象的指針拆成兩部分,一部分直接保存數(shù)據(jù),另一部分作為特殊標(biāo)記,表示這是一個特別的指針,不指向任何一個地址。所以,引入了Tagged Pointer對象之后,64位CPU下NSNumber的內(nèi)存圖變成了以下這樣:

Tagged Pointer

測試

#import 

int main(int argc, const char * argv[]) {
 @autoreleasepool {
 // insert code here...
 NSNumber *number1 = @1;
 NSNumber *number2 = @2;
 NSNumber *number3 = @3;
 NSNumber *numberFFFF = @(0xFFFF);

 NSNumber *numberLager = @(MAXFLOAT);

 NSLog(@"number1 pointer is %p", number1);
 NSLog(@"number2 pointer is %p", number2);
 NSLog(@"number3 pointer is %p", number3);
 NSLog(@"numberLager pointer is %p", numberLager);

 /*
 2017-03-10 12:07:50.731726 TaggedPoint[1690:50438] number1 pointer is 0x127
 2017-03-10 12:07:50.731992 TaggedPoint[1690:50438] number2 pointer is 0x227
 2017-03-10 12:07:50.732011 TaggedPoint[1690:50438] number3 pointer is 0x327
 2017-03-10 12:07:50.732043 TaggedPoint[1690:50438] numberLager pointer is 0x1002006a0
 */


 }
 return 0;
}

以 0x127 為例 去掉 tag27(假設(shè)27為標(biāo)記) 0x1 就是number 的值。

0x227

0x327

都有這種規(guī)律

numberLager 存儲的值為MAXFloat 顯然超過了tagged pointer 可以存儲的范圍。

所以打印的地址是單純的指針地址,指向存儲numberLager的內(nèi)存地址。

對于isa指針的影響

因為tagged pointer 不是一個真正的對象,如果使用isa指針在編譯時會報錯。

如圖:

提示我們改為object_getClass()

object_getClass()中做了相應(yīng)的處理

由于object_getClass()沒有對應(yīng)的實現(xiàn),只能從其他地方窺探一二

objc-weak.mm

weak_read_no_lock(weak_table_t *weak_table, id *referrer_id) 
{
 objc_object **referrer = (objc_object **)referrer_id;
 objc_object *referent = *referrer;
 if (referent->isTaggedPointer()) return (id)referent;
 //...
}
inline bool 
objc_object::isTaggedPointer() 
{
#if SUPPORT_TAGGED_POINTERS
 return ((uintptr_t)this & TAG_MASK);
#else
 return false;
#endif
}

這里取對象的值做了一些判斷

如果是tagged pointer , 對象的值就是指針

如果非tagged pointer , 對象的值是指針指向的內(nèi)存區(qū)域中的值

總結(jié)

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

相關(guān)文章

  • iOS9蘋果將原h(huán)ttp協(xié)議改成了https協(xié)議的方法

    iOS9蘋果將原h(huán)ttp協(xié)議改成了https協(xié)議的方法

    這篇文章主要介紹了iOS9蘋果將原h(huán)ttp協(xié)議改成了https協(xié)議的方法的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • iOS實現(xiàn)簡單的頭部縮放功能

    iOS實現(xiàn)簡單的頭部縮放功能

    這篇文章主要介紹了iOS 簡單的頭部縮放效果,頭部伴隨模糊效果放大縮小,并在一定位置時懸停充當(dāng)導(dǎo)航欄,本文給大家提供實現(xiàn)思路,需要的朋友可以參考下
    2018-08-08
  • IOSdrawRect實現(xiàn)雪花飄落效果

    IOSdrawRect實現(xiàn)雪花飄落效果

    這篇文章主要為大家詳細介紹了IOSdrawRect實現(xiàn)雪花飄落效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • iOS開發(fā)教程之WKWebView與JS的交互

    iOS開發(fā)教程之WKWebView與JS的交互

    這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之WKWebView與JS的交互的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • iOS開發(fā)仿電商類APP首頁實例

    iOS開發(fā)仿電商類APP首頁實例

    本篇文章主要介紹了iOS開發(fā)仿電商類APP首頁實例,主要是利用ui布局,具有一定的參考價值,有需要的可以了解一下。
    2016-11-11
  • IOS  手勢操作詳解及實例總結(jié)篇

    IOS 手勢操作詳解及實例總結(jié)篇

    這篇文章主要介紹了IOS 手勢操作詳解及實例總結(jié)篇的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • iOS開發(fā)之適配iOS10以及Xcode8

    iOS開發(fā)之適配iOS10以及Xcode8

    這篇文章主要為大家詳細介紹了iOS開發(fā)之適配iOS10以及Xcode8的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS開發(fā)中ViewController的頁面跳轉(zhuǎn)和彈出模態(tài)

    iOS開發(fā)中ViewController的頁面跳轉(zhuǎn)和彈出模態(tài)

    這篇文章主要介紹了iOS開發(fā)中ViewController的頁面跳轉(zhuǎn)和彈出模態(tài),ViewController是MVC開發(fā)模式中一個重要的類,需要的朋友可以參考下
    2015-10-10
  • iOS 動畫實戰(zhàn)之釣魚小游戲?qū)嵗a

    iOS 動畫實戰(zhàn)之釣魚小游戲?qū)嵗a

    最近小編做了一個釣魚小游戲,平時沒有做過,所以上手有點急躁,不過,最終還是實現(xiàn)了,下面小編給大家分享iOS 動畫實戰(zhàn)之釣魚小游戲的實現(xiàn)思路,感興趣的朋友一起看看吧
    2018-02-02
  • iOS開發(fā)輸入自動填充UITextField背景色

    iOS開發(fā)輸入自動填充UITextField背景色

    如何在iOS中實現(xiàn)輸入時自動填充背景色的效果,首先,我們設(shè)置UITextField的背景色為初始顏色,然后,通過設(shè)置UITextField的代理,并監(jiān)聽UITextField的輸入事件,我們在用戶開始輸入時將其背景色改變?yōu)楦吡令伾?在用戶結(jié)束輸入時恢復(fù)為初始顏色
    2023-10-10

最新評論

潞城市| 天门市| 灵台县| 科技| 葫芦岛市| 宜昌市| 铜陵市| 东阳市| 唐河县| 舞阳县| 林甸县| 天长市| 禄丰县| 多伦县| 太仓市| 威远县| 巨鹿县| 高青县| 孝感市| 大连市| 德阳市| 孝感市| 集贤县| 曲阜市| 苗栗市| 化德县| 庆城县| 洱源县| 莱西市| 新沂市| 吉木乃县| 岳阳县| 交城县| 黄浦区| 南江县| 平安县| 汕尾市| 靖边县| 班玛县| 界首市| 安图县|