《從零開始學Swift》學習筆記(Day 62)——Core Foundation框架之記憶體託管物件與非託管物件

智捷關東昇發表於2016-04-07

原創文章,歡迎轉載。轉載請註明:關東昇的部落格

記憶體託管物件
  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_關東昇。 關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程資訊

enter image description here

更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com 智捷課堂論壇網站:http://51work6.com/forum.php

相關文章