《從零開始學Swift》學習筆記(Day 62)——Core Foundation框架之記憶體託管物件與非託管物件
原創文章,歡迎轉載。轉載請註明:關東昇的部落格
記憶體託管物件
Swift中呼叫Core Foundation函式獲得物件時候,物件分為:記憶體託管物件和記憶體非託管物件。
記憶體託管物件就是由編譯器幫助管理記憶體,我們不需要呼叫CFRetain函式獲得物件所有權,也不需要呼叫 CFRelease函式放棄物件所有權。
獲得這些記憶體託管物件的方法,是採用了CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED註釋宣告,示例程式碼:
-(CGPathRef)makeToPath CF_RETURNS_RETAINED { UIBezierPath* triangle = [UIBezierPath bezierPath]; [triangle moveToPoint:CGPointZero]; [triangle addLineToPoint:CGPointMake(self.view.frame.size.width,0)]; [triangle addLineToPoint:CGPointMake(0, self.view.frame.size.height)]; [triangle closePath]; CGPathRef theCGPath = [triangle CGPath]; return CGPathCreateCopy(theCGPath); }
記憶體託管物件使用起來比較簡單,不需要我們做額外的事情。
func CFStringCreateWithCString(_ alloc: CFAllocator!,
_ cStr: UnsafePointer<Int8>,
_ encoding: CFStringEncoding) -> CFString! //記憶體託管物件
func CFHostCreateCopy(_ alloc: CFAllocator?,
_ host: CFHost) -> Unmanaged<CFHost> //記憶體非託管物件
記憶體非託管物件
記憶體非託管物件就是記憶體需要程式設計師自己管理。這是由於在獲得物件的方法中沒有使用CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED註釋宣告,編譯器無法幫助管理記憶體。在具體使用時候我們可以上一節的方法判斷是否為非記憶體託管物件。
記憶體非託管物件使用起來有些麻煩,要根據獲得所有權方法,進行相應的處理。
1、 如果一個函式名中包含Create或Copy,則呼叫者獲得這個物件的同時也獲得物件所有權,返回值Unmanaged需要呼叫takeRetainedValue()方法獲得物件。呼叫者不再使用物件時候,Swift程式碼中需要呼叫CFRelease函式放棄物件所有權,這是因為Swift是ARC記憶體管理的。
2、 如果一個函式名中包含Get,則呼叫者獲得這個物件的同時不會獲得物件所有權,返回值Unmanaged需要呼叫takeUnretainedValue()方法獲得物件。 示例程式碼如下:
let host: CFHost = CFHostCreateWithName(kCFAllocatorDefault,
"127.0.0.1").takeRetainedValue()
let hostNames: CFArray = CFHostGetNames(host, nil)!.takeUnretainedValue()
歡迎關注關東昇新浪微博@tony_關東昇。 關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程資訊
更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com 智捷課堂論壇網站:http://51work6.com/forum.php
相關文章
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- [.net 物件導向程式設計進階] (8) 託管與非託管物件程式設計
- 《從零開始學Swift》學習筆記(Day 24)——列舉Swift筆記
- 《從零開始學Swift》學習筆記(Day 16)——字典集合Swift筆記
- 託管堆記憶體佔用記憶體
- 《從零開始學Swift》學習筆記(Day 59)——程式碼排版Swift筆記
- 《從零開始學Swift》學習筆記(Day 45)——重寫方法Swift筆記
- 《從零開始學Swift》學習筆記(Day 36)——靜態方法Swift筆記
- 《從零開始學Swift》學習筆記(Day 17)——Swift中陣列集合Swift筆記陣列
- 託管與非託管的混合程式設計程式設計
- 《從零開始學Swift》學習筆記(Day 49)——擴充套件宣告Swift筆記套件
- 《從零開始學Swift》學習筆記(Day 44)——重寫屬性Swift筆記
- 《從零開始學Swift》學習筆記(Day 46)——下標重寫Swift筆記
- 《從零開始學Swift》學習筆記(Day 40)——解構函式Swift筆記函式
- 《從零開始學Swift》學習筆記(Day 41)——類的繼承Swift筆記繼承
- 《從零開始學Swift》學習筆記(Day 29)——訪問級別Swift筆記
- 《從零開始學Swift》學習筆記(Day 32)——計算屬性Swift筆記
- 《從零開始學Swift》學習筆記(Day 33)——屬性觀察者Swift筆記
- 《從零開始學Swift》學習筆記(Day 23)——尾隨閉包Swift筆記
- 《從零開始學Swift》學習筆記(Day 27)——可選型別Swift筆記型別
- 《從零開始學Swift》學習筆記(Day 10)——運算子是“ +、-、*、/ ”嗎?Swift筆記
- 《從零開始學Swift》學習筆記(Day 56)—— Swift編碼規範之命名規範Swift筆記
- 《從零開始學Swift》學習筆記(Day 3)——Swift 2.0之後增加的關鍵字Swift筆記
- 《從零開始學Swift》學習筆記(Day 25)——類和結構體定義Swift筆記結構體
- 記憶體洩漏問題分析之非託管資源洩漏記憶體
- 《從零開始學Swift》學習筆記(Day54)——丟擲錯誤Swift筆記
- 《從零開始學Swift》學習筆記(Day 47)——final關鍵字Swift筆記
- 《從零開始學Swift》學習筆記(Day 35)——會使用下標嗎?Swift筆記
- 《從零開始學Swift》學習筆記(Day 22)——閉包那些事兒!Swift筆記
- 《從零開始學Swift》學習筆記(Day 21)——函式返回值Swift筆記函式
- 重學c#系列——c# 託管和非託管資源(三)C#
- 《從零開始學Swift》學習筆記(Day48)——型別檢查與轉換Swift筆記型別
- 《從零開始學Swift》學習筆記(Day 55)——使用try?和try!區別Swift筆記
- 《從零開始學Swift》學習筆記(Day 37)——預設建構函式Swift筆記函式
- 《從零開始學Swift》學習筆記(Day 39)——建構函式過載Swift筆記函式
- 《從零開始學Swift》學習筆記(Day 8)——小小常量、變數大作用Swift筆記變數
- 《從零開始學Swift》學習筆記(Day 12)——說幾個特殊運算子Swift筆記
- 《從零開始學Swift》學習筆記(Day 18)——有幾個分支語句?Swift筆記