原創文章,歡迎轉載。轉載請註明:關東昇的博客 php
內存託管對象java
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> //內存非託管對象
內存非託管對象spa
內存非託管對象就是內存須要程序員本身管理。這是因爲在得到對象的方法中沒有使用CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED註釋聲明,編譯器沒法幫助管理內存。在具體使用時候咱們能夠上一節的方法判斷是否爲非內存託管對象。.net
內存非託管對象使用起來有些麻煩,要根據得到全部權方法,進行相應的處理。設計
1. 若是一個函數名中包含Create或Copy,則調用者得到這個對象的同時也得到對象全部權,返回值Unmanaged<T>須要調用takeRetainedValue()方法得到對象。調用者再也不使用對象時候,Swift代碼中須要調用CFRelease函數放棄對象全部權,這是由於Swift是ARC內存管理的。code
2. 若是一個函數名中包含Get,則調用者得到這個對象的同時不會得到對象全部權,返回值Unmanaged<T>須要調用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