Core Foundation對象的內存管理

  • Foundation對象和Core Foundation對象重要的區別是ARC下的內存管理問題,在非ARC下二者都須要開發者手動管理內存,沒有區別,可是在ARC下系統只會自動管理Foundation對象的釋放,而不支持Core Foundation對象的管理,所以在ARC下二者進行轉換後必需要肯定對象是由開發者手動管理仍是ARC系統管理,不然可能致使內存泄露
  • 因爲ARC不能管理Core Foundation對象的生命週期,因此Core Foundation對象和Foundation對象轉換時,須要使用到__bridge、__bridge_retained和__bridge_transfer三個轉換關鍵字
  1. __bridge CFOC對象轉化時只涉及對象類型,不涉及對象全部權的轉化,他的含義是,不改變對象的管理權全部者,原本由ARC管理的Foundation對象,轉換成Core Foundation對象後依舊由ARC管理,原本有開發者手動管理的Core Foundation對象轉換成Foundation對象後,繼續由開發者手動管理git

  2. __bridge_transfer也可使用CFBridgingRelease 用在將Core Foundation對象轉換爲Foundation對象,同時將對象內存管理權交給ARC,由ARC來代替咱們管理內存github

  3. __bridge_retained也可使用CFBridgingRetain 用在將Foundation對象轉換爲Core Foundation對象,同時將對象內存管理權交給咱們,後續須要使用CFRelease或者相關方法來釋放對象,須要咱們手動來管理內存bash

  • 以下例子爲,網絡請求中包含特殊字符的處理,報錯信息爲 Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo={NSLocalizedDescription=unsupported URL, NSUnderlyingError=0x7fa9b1d06120 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}}
NSString * resultUrl = @"網絡請求字段或者地址";
// 處理請求中包含的特殊字符,如「+」
NSString *endResutl = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)resultUrl, NULL, CFSTR("+"), kCFStringEncodingUTF8);
複製代碼

附:個人博客地址網絡

相關文章
相關標籤/搜索