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

原創文章,歡迎轉載。轉載請註明:關東昇的博客  php

內存託管對象java

Swift中調用Core Foundation函數得到對象時候,對象分爲:內存託管對象和內存非託管對象。程序員

內存託管對象就是由編譯器幫助管理內存,咱們不須要調用CFRetain函數得到對象全部權,也不須要調用CFRelease函數放棄對象全部權。微信

得到這些內存託管對象的方法,是採用了CF_RETURNS_RETAINEDCF_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>    //內存非託管對象

內存非託管對象spa

內存非託管對象就是內存須要程序員本身管理。這是因爲在得到對象的方法中沒有使用CF_RETURNS_RETAINEDCF_RETURNS_NOT_RETAINED註釋聲明,編譯器沒法幫助管理內存。在具體使用時候咱們能夠上一節的方法判斷是否爲非內存託管對象。.net

內存託管對象使用起來有些麻煩,要根據得到全部權方法,進行相應的處理。設計

1. 若是一個函數名中包含CreateCopy,則調用者得到這個對象的同時也得到對象全部權,返回值Unmanaged<T>須要調用takeRetainedValue()方法得到對象。調用者再也不使用對象時候,Swift代碼中須要調用CFRelease函數放棄對象全部權,這是由於SwiftARC內存管理的。code

 

2. 若是一個函數名中包含Get,則調用者得到這個對象的同時不會得到對象全部權,返回值Unmanaged<T>須要調用takeUnretainedValue()方法得到對象。

示例代碼以下:

let host: CFHost = CFHostCreateWithName(kCFAllocatorDefault, 
        Ê"127.0.0.1").takeRetainedValue()
        
let hostNames: CFArray = CFHostGetNames(host, nil)!.takeUnretainedValue()

 

歡迎關注關東昇新浪微博@tony_ 關東昇。
關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程信息
 

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

相關文章
相關標籤/搜索