你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 《從零開始學Swift》學習筆記(Day 62)——Core Foundation框架之內存托管對象與非托管對象

《從零開始學Swift》學習筆記(Day 62)——Core Foundation框架之內存托管對象與非托管對象

編輯:IOS開發綜合

  Swift中調用CoreFoundation函數獲得對象時候,對象分為:內存托管對象和內存非托管對象。

  內存托管對象就是由編譯器幫助管理內存,我們不需要調用CFRetain函數獲得對象所有權,也不需要調用CFRelease函數放棄對象所有權。

  獲得這些內存托管對象的方法,是采用了CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED注釋聲明,示例代碼:  

-(CGPathRef)makeToPathCF_RETURNS_RETAINED
{
    UIBezierPath* triangle = [UIBezierPathbezierPath];
    [triangle moveToPoint:CGPointZero];
    [triangleaddLineToPoint: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);
}

  內存托管對象使用起來比較簡單,不需要我們做額外的事情。  

funcCFStringCreateWithCString(_ 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()

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved