文章出處

iOS程序訪問HTTP資源時需要對URL進行UTF8編碼,特酷吧在之前一直都喜歡使用NSString的stringByAddingPercentEscapesUsingEncoding方法進行編碼。今天在使用Analyze分析工程時,提示下面的方法可能存在內存泄露:
NSString *enString =(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)stringURL, NULL, NULL, kCFStringEncodingUTF8);
注意到這個方法也是一個編碼方案,就查詢了兩種方式的區別,有些收獲。
stringByAddingPercentEscapesUsingEncoding方法有一個問題:不會轉轉URL中的"%&?"等符號[這個很好理解,因為不好區分這些特殊字符到底是連接符號還是參數值]。這些字符在URL語法中有特殊的含義,如果在URL的參數中有這些字符,就需要轉化為"%+ASCII"的形式。如果參數中存在這些字符,而我們又使用了stringByAddingPercentEscapesUsingEncoding方法,則服務器會將參數中的沒有轉義的&當做分隔符,造成分析錯誤。因為我的工程中幾乎沒有在參數中存在%&等符號的情況,所以一直用也沒問題。但咱們還是要使用正規的方式。
一般來說都是用:

折疊C/C++ Code復制內容到剪貼板
  1. CFStringRef CFURLCreateStringByAddingPercentEscapes(  
  2. CFAllocatorRef allocator,  
  3. CFStringRef originalString, /*待轉碼的類型*/  
  4. CFStringRef charactersToLeaveUnescaped, /*指示不轉義的字符*/  
  5. CFStringRef legalURLCharactersToBeEscaped,/*指示確定轉義的字符*/  
  6. CFStringEncoding encoding); /*編碼類型*/  


方案就是單獨編碼參數值(如果編碼整個URL的話會講URL分割符&等也編碼),最后拼接成完整的字符串。
示例Demo如下:

折疊C/C++ Code復制內容到剪貼板
  1. CFStringRef escaped = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);  
  2. NSString *out = [NSString stringWithString:(NSString *)escaped];  
  3. CFRelease(escaped);//記得釋放  


另外一個小知識點:
在之前做圖片切割時經常用到如下代碼

折疊C/C++ Code復制內容到剪貼板
  1. CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);  
  2. UIImage *newImage = [UIImage imageWithCGImage:newImageRef];  


實際上這個代碼會造成內存泄露,正確的方式是還需要釋放newImageRef,如下:

折疊C/C++ Code復制內容到剪貼板
  1. CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);  
  2. UIImage *newImage = [UIImage imageWithCGImage:newImageRef];  
  3. CGImageRelease(newImageRef);  

<br /


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()