你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> IOS使用CFURLCreateStringByAddingPercentEscapes進行URL編碼

IOS使用CFURLCreateStringByAddingPercentEscapes進行URL編碼

編輯:關於IOS



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

1 2 3 4 5 6 CFStringRef CFURLCreateStringByAddingPercentEscapes( CFAllocatorRef allocator, CFStringRef originalString, /*待轉碼的類型*/ CFStringRef charactersToLeaveUnescaped, /*指示不轉義的字符*/ CFStringRef legalURLCharactersToBeEscaped,/*指示確定轉義的字符*/ CFStringEncoding encoding); /*編碼類型*/

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

1 2 3 CFStringRef escaped = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8); NSString *out = [NSString stringWithString:(NSString *)escaped]; CFRelease(escaped);//記得釋放

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

1 2 CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect); UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

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

1 2 3 CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect); UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; CGImageRelease(newImageRef);
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved