【四】Swift-指針&內存管理

code_小馬swift

目錄

一搞莺、指針

1.為什么說指針是不安全的

2.指針類型

3.原始指針的使用

4.泛型指針的使用

5.內存綁定


二缤苫、內存管理

1.弱引用

2.Unowned

一较沪、指針

1.為什么說指針是不安全的

  • \underline{野指針:}在創(chuàng)建一個對象的時候优俘,是需要在堆分配內存空間玫膀。但是這個內存空間的生命周期是有限的封断。如果我們使用指針指向這塊內存空間斯辰,如果當前內存空間的生命周期結束了(引用計數為0,系統(tǒng)回收內存空間)坡疼,那么我們當前的指針就變成了未定義的行為了(野指針)椒涯。
  • \underline{我們創(chuàng)建的內存空間是有邊界的 }:比如我們創(chuàng)建一個count為10的數組,這個時候我們通過指針訪問到了index = 11的位置回梧,這個時候就越界了废岂,訪問了一個未知的內存空間。
  • \underline{指針類型與內存類型不一致 }狱意,也是不安全的湖苞。

2.指針類型

Swift中指針分為兩大類:
typed pointer 指定數據類型的指針;
raw pointer未指定數據類型的指針(原生指針)详囤。

基本上我們接觸到的指針類型有以下幾中

Swift Object-C 說明 類型
unsafePointer<T> const T * 指針及所指向的內容都不可變 typed pointer
unsafeMutablePointer<T> T * 指針及其所指向的內存內容均可變 typed pointer
unsafeRawPointer const void * 指針指向的內存區(qū)域未定 原生指針
unsafeMutableRawPointer void * 同上 原生指針
unsafeBufferPointer<T> typed pointer
unsafeMutableBufferPointer<T> typed pointer
unsafeRawBufferPointer 原生指針
unsafeMutableRawBufferPointer 原生指針

3.原始指針的使用

三個基本概念:內存大小size财骨、步長信息stride镐作、字節(jié)對齊alignment

struct YGTeacher {
    var age: Int = 18
    var haveCar: Bool = true
}
//內存大小
print(MemoryLayout<YGTeacher>.size)
//步長:當前指針需要移動的真實大小
print(MemoryLayout<YGTeacher>.stride)
//對齊
print(MemoryLayout<YGTeacher>.alignment)
  • stride(步長):
    如果在內存當中,我要存儲幾個連續(xù)的YGTeacher的實例隆箩,那這個步長信息指的是:
    從第一個YGTeacher實例到下一個YGTeacher實例该贾,它所跨越的長度信息。

YGTeacher.jpeg

分析上圖打印結果:
Int類型的age占了8個字節(jié)
Bool類型的haveCar占了1個字節(jié)
所以:YGTeacher這個結構體實際大小size9個字節(jié)
由于結構體YGTeacher的對象內存分配字節(jié)對齊alignment8個字節(jié)捌臊,
所以不足8字節(jié)的Bool類型就要補齊到8個字節(jié)(字節(jié)對齊原則)杨蛋,
所以當前的步長信息stride16個字節(jié)

  • 使用Raw Pointer來存儲4個整形的數據:
    這里我們需要選取的是 UnsafeMutableRawPointer
    如下圖所示:
存儲  :storeBytes
加載  :load
移動  :advanced
輸出臺信息.png
補充 storeBytes 存儲方法

4.泛型指針的使用

  • 如下圖:不可變指針-只讀,指針和指針指向的地址都不可修改理澎;
    可變類型的指針逞力,指針和指針指向的內容都是可變的。


    可變/不可變類型的指針
  • 指定數據類型的可變指針

分配內存空間allocate糠爬、初始化變量initialize寇荧、
取消初始設置deinitialize、deallocate釋放內存空間


泛型指針的使用
  • 我們可以通過以下方式來初始實話我們的指針
struct YGStruct {
    var age: Int
    var height: Double
}
//分配內存空間执隧,連續(xù)存儲5個結構體的大小揩抡、明確指針內存儲的數據類型為 YGStruct
var tPtr = UnsafeMutablePointer<YGStruct>.allocate(capacity: 5)
//存儲第一個內存地址,賦值
tPtr[0] = YGStruct(age: 15, height: 160.0)
tPtr[1] = YGStruct(age: 21, height: 175.0)
tPtr[2] = YGStruct(age: 25, height: 181.0)
print("①",tPtr[0],"\n1=",tPtr[1],"\n2=",tPtr[2],"\n3=",tPtr[3],"\n4=",tPtr[4]);
//取消初始化釋放內存空間
tPtr.deinitialize(count: 5)
tPtr.deallocate()

  • 我們還可通過以下方式初始化指針
struct YGStruct_tow {
    var age = 20
    var height = 1.83
}

let p = UnsafeMutablePointer<YGStruct_tow>.allocate(capacity: 2)
p.initialize(to: YGStruct_tow())
p.advanced(by: MemoryLayout<YGStruct_tow>.stride).initialize(to: YGStruct_tow(age: 25, height: 1.83))

p.deinitialize(count: 2)
p.deallocate()

記住 initialize镀琉、advanced捅膘、deinitialize、deallocate要 成對兒 使用滚粟。

5.內存綁定

二寻仗、內存管理

1.弱引用

2.Unowned

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凡壤,隨后出現的幾起案子署尤,更是在濱河造成了極大的恐慌,老刑警劉巖亚侠,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曹体,死亡現場離奇詭異,居然都是意外死亡硝烂,警方通過查閱死者的電腦和手機箕别,發(fā)現死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滞谢,“玉大人串稀,你說我怎么就攤上這事∈ㄑ睿” “怎么了母截?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長橄教。 經常有香客問我清寇,道長喘漏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任华烟,我火速辦了婚禮翩迈,結果婚禮上,老公的妹妹穿的比我還像新娘盔夜。我一直安慰自己负饲,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布比吭。 她就那樣靜靜地躺著,像睡著了一般姨涡。 火紅的嫁衣襯著肌膚如雪衩藤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天涛漂,我揣著相機與錄音赏表,去河邊找鬼。 笑死匈仗,一個胖子當著我的面吹牛瓢剿,可吹牛的內容都是我干的。 我是一名探鬼主播悠轩,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼间狂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了火架?” 一聲冷哼從身側響起鉴象,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎何鸡,沒想到半個月后纺弊,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡骡男,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年淆游,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隔盛。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡犹菱,死狀恐怖,靈堂內的尸體忽然破棺而出吮炕,到底是詐尸還是另有隱情已亥,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布来屠,位于F島的核電站虑椎,受9級特大地震影響震鹉,放射性物質發(fā)生泄漏。R本人自食惡果不足惜捆姜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一传趾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泥技,春花似錦浆兰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至店茶,卻和暖如春蜕便,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贩幻。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工轿腺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丛楚。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓族壳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趣些。 傳聞我的和親對象是個殘疾皇子仿荆,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容

  • 本文主要介紹swift中的指針 swift中的指針分為兩類 typed pointer 指定數據類型指針,即 Un...
    輝輝歲月閱讀 147評論 0 1
  • 本文系學習Swift中的指針操作詳解的整理 默認情況下Swift是內存安全的坏平,蘋果官方不鼓勵我們直接操作內存赖歌。但是...
    流火緋瞳閱讀 15,045評論 2 28
  • Swift 進階之路 文章匯總[http://www.reibang.com/p/5fbedf309237] S...
    Style_月月閱讀 1,606評論 7 9
  • 指針 Swift中指針分為兩類: typed pointer:指定數據類型指針,UnsafePointer<T>功茴,...
    YY323閱讀 2,762評論 0 1
  • 本文主要介紹Swift中的指針 Swift中的指針主要分為兩類 typed pointer 指定數據類型的指針庐冯,即...
    源本平凡閱讀 426評論 0 0