指針

指針類型

是不安全的

1.UnsafePointer<Pointee>            類似于const Pointee * 只可以用來訪問內(nèi)存 不可以修改
2.UnsafeMutablePointer<Pointee>     類似于Pointee *       可以用來訪問內(nèi)存 可以修改
3.UnsafeRawPointer                  類似于const void *    不支持泛型
4.UnsafeMutableRawPointer           類似于void *          不支持泛型
var age = 10
func test1(_ ptr: UnsafeMutablePointer<Int>){
    ptr.pointee += 10
}
func test2(_ ptr: UnsafePointer<Int>){
    print(ptr.pointee)
    //ptr.pointee 取出指針指向的數(shù)據(jù)
}
test1(&age)
test2(&age)
print(age)

20
20

ptr.pointee 取出指針指向的數(shù)據(jù)

func test3(_ ptr: UnsafeRawPointer){
    let d = ptr.load(as: Int.self)
    print("test3",d)
}

func test4(_ ptr: UnsafeMutableRawPointer){
    //不支持泛型 那么就要自己設(shè)置是什么類型 傳入什么值
    ptr.storeBytes(of: 30, as: Int.self)
}

test3(&age)
test4(&age)
print(age)

ptr.load(as: Int.self) 指針指向的Int數(shù)據(jù)
ptr.storeBytes(of: 30, as: Int.self) 把數(shù)據(jù)存儲(chǔ)到指針指向的空間

指針的應(yīng)用

var arr = NSArray(objects: 11,22,33,44)
arr.enumerateObjects { (element, idx, stop) in
    print(idx,element)
    if idx == 2 {
        stop.pointee = true
    }
}

stop.pointee 代表執(zhí)行完大括號(hào)之后再判斷條件是否滿足 是否繼續(xù)執(zhí)行

可讀行更好
var arr = NSArray(objects: 11,22,33,44)
for (idx,element) in arr.enumerated() {
    print(idx,element)
    if idx == 2 {
        break
    }
}
獲得指向某個(gè)變量的指針
var age = 10
var ptr = withUnsafePointer(to: &age) { $0 }
var ptr2 = withUnsafeMutablePointer(to: &age) { $0
}

ptr2.pointee = 30

print(age)
var age = 10
var ptr = withUnsafePointer(to: &age) { UnsafeRawPointer($0)
}
var ptr2 = withUnsafeMutablePointer(to: &age) { UnsafeMutableRawPointer($0)
}

ptr2.storeBytes(of: 30, as: Int.self)
print(ptr.load(as: Int.self))
print(age)
獲得指向堆空間實(shí)例的指針
class Person {
    var age: Int
    init(age: Int) {
        self.age = age
    }
}
var person = Person(age: 21)
var ptr = withUnsafePointer(to: &person) { UnsafeRawPointer($0)
}
//ptr 指向person這個(gè)指針變量 存放person這個(gè)指針變量的地址值
//ptr.pointee 等價(jià)于person
print(ptr)

var ptr2 = UnsafeMutableRawPointer(bitPattern: ptr.load(as: UInt.self))
print(ptr2 ?? 2)
//ptr2 堆空間地址值 Person的地址值

創(chuàng)建指針

var ptr = malloc(16)
//往堆空間里面放入數(shù)據(jù)
ptr?.storeBytes(of: 10, as: Int.self)
ptr?.storeBytes(of: 20, toByteOffset: 8, as: Int.self)
print(ptr!)
free(ptr)
var ptr = UnsafeMutableRawPointer.allocate(byteCount: 16, alignment: 1)
//指針偏移 8個(gè)字節(jié)
ptr.advanced(by: 8)
//把22存放在后8個(gè)字節(jié)
ptr.advanced(by: 8).storeBytes(of: 22, as: Int.self)
//釋放
ptr.deallocate()
//capacity 是容量 相當(dāng)于Int的8個(gè)字節(jié) * 3 = 24個(gè)字節(jié)
var ptr = UnsafeMutablePointer<Int>.allocate(capacity: 2)
ptr.pointee = 10
ptr.advanced(by: 8).pointee = 20
//初始化內(nèi)存 用10初始化前8個(gè)字節(jié)
ptr.initialize(to: 10)
//連續(xù)的是2個(gè)8個(gè)字節(jié)的10 初始化內(nèi)存
ptr.initialize(repeating: 10, count: 2)
//successor 后記 跳8個(gè)字節(jié)(如果是Int)  下一個(gè)8個(gè)字節(jié)初始化10
ptr.successor().initialize(to: 10)
//取出下一個(gè)字節(jié)的內(nèi)容
print(ptr.successor().pointee)
print((ptr + 1).pointee)
print(ptr[0])
print(ptr[1])
//反初始化 防止內(nèi)存泄露
ptr.deinitialize(count: 3)
//釋放
ptr.deallocate()
class Person {
    
    var age: Int
    var name: String
    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
    deinit {
        print(name,"deinit")
    }
}

var ptr = UnsafeMutablePointer<Person>.allocate(capacity: 3)
ptr.initialize(to: Person(age: 20, name: "jack"))
(ptr + 1).initialize(to: Person(age: 21, name: "Rose"))
(ptr + 2).initialize(to: Person(age: 22, name: "Kate"))

//ptr[2].name
ptr.deinitialize(count: 3)
ptr.deallocate()

初始化多少內(nèi)存 就要反初始化多少內(nèi)存 否則 內(nèi)存泄露

指針之間的轉(zhuǎn)換

var ptr = UnsafeMutableRawPointer.allocate(byteCount: 16, alignment: 1)
//轉(zhuǎn)換為UnsafeMutablePointer指針
var ptr2 = ptr.assumingMemoryBound(to: Int.self)
//ptr2 是泛型的  ptr2 + 1 就是移動(dòng)8個(gè)字節(jié)
var ptr4 = ptr2 + 1
//ptr 不是泛型的 就是移動(dòng)8個(gè)字節(jié)
var ptr3 = (ptr + 8).assumingMemoryBound(to: Int.self)
//強(qiáng)制轉(zhuǎn)換
var ptr = UnsafeMutableRawPointer.allocate(byteCount: 16, alignment: 1)
var ptr5 = unsafeBitCast(ptr, to: Int.self)

unsafeBitCast 是忽略數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換 不會(huì)因?yàn)閿?shù)據(jù)類型的變化而改變?cè)瓉淼膬?nèi)存數(shù)據(jù)

unsafeBitCast

var person = Person()
//把person里面的內(nèi)容放入ptr 內(nèi)存數(shù)據(jù)是一樣的 類型不同
var ptr = unsafeBitCast(person, to: UnsafeRawPointer.self)
print(ptr)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子积仗,更是在濱河造成了極大的恐慌傅事,老刑警劉巖翅娶,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庆聘,死亡現(xiàn)場(chǎng)離奇詭異泞边,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)问麸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門往衷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人严卖,你說我怎么就攤上這事席舍。” “怎么了哮笆?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵来颤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我稠肘,道長(zhǎng)福铅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任项阴,我火速辦了婚禮滑黔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘环揽。我一直安慰自己略荡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布薯演。 她就那樣靜靜地躺著撞芍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跨扮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天验毡,我揣著相機(jī)與錄音衡创,去河邊找鬼。 笑死晶通,一個(gè)胖子當(dāng)著我的面吹牛璃氢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狮辽,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼一也,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了喉脖?” 一聲冷哼從身側(cè)響起椰苟,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎树叽,沒想到半個(gè)月后舆蝴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年洁仗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了层皱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狮含。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猴抹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篙程,到底是詐尸還是另有隱情她奥,我是刑警寧澤瓮增,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站方淤,受9級(jí)特大地震影響钉赁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜携茂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一你踩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讳苦,春花似錦带膜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咐扭,卻和暖如春芭挽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝗肪。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工袜爪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薛闪。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓辛馆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親豁延。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昙篙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容