2012-09-17 70 views
0

下面的代碼是非ARC代碼,有人可以告訴我如何將它轉換爲ARC,當我使用它時,它有一個內存泄漏,對URL進行編碼。NSString + EncodeURIComponent

#import "NSString+EncodeURIComponent.h" 

@implementation NSString (EncodeURIComponent) 

+ (NSString*)stringEncodeURIComponent:(NSString *)string { 
    return [((NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                   (CFStringRef)string, 
                   NULL, 
                   (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                   kCFStringEncodingUTF8)) autorelease]; 
} 

@end 

在此先感謝..

+0

remove autorelease –

+0

ARC不允許autorelease關鍵字。編譯器不會告訴你那個嗎?您應該嘗試編譯並查看編譯器所說的內容。 – Steven

+0

當我打開ARC時,它表示將目標c指針類型'CFStringRef'轉換爲目標c指針類型'NSString'需要橋接轉換。它不僅僅是autorelease。 – malhaar

回答

3
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
              (__bridge CFStringRef)string, 
              NULL, 
              CFSTR("!*'();:@&=+$,/?%#[]"), 
              kCFStringEncodingUTF8)); 

但這在followng:

  • 取出autorelease
  • 經過核心基金會對象ARC的使用CFBridgingRelease()。這平衡了Create。原則上(儘管未實現),Core Foundation執行CFRelease(),ARC執行objc_retain()
  • 添加_bridge的情況下使用string。這告訴編譯器,您沒有在ARC和Core Foundation之間轉移所有權。您只需要Core Foundation使用ARC變量。
  • 使用CFSTR()創建一個常量Core Foundation字符串。這比創建常量NSString更方便,然後將它鑄造到Core Foundation。

請參閱Transitioning to ARC Release Notes中的「管理免費橋接」。