使用CFURLCreateStringByAddingPercentEscapes进行URL编码-飞外

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复制内容到剪贴板CFStringRefCFURLCreateStringByAddingPercentEscapes(CFAllocatorRefallocator,CFStringReforiginalString,/*待转码的类型*/CFStringRefcharactersToLeaveUnescaped,/*指示不转义的字符*/CFStringReflegalURLCharactersToBeEscaped,/*指示确定转义的字符*/CFStringEncodingencoding);/*编码类型*/


方案就是单独编码参数值(如果编码整个URL的话会讲URL分割符 等也编码),最后拼接成完整的字符串。
示例Demo如下:

折叠展开C/C++ Code复制内容到剪贴板CFStringRefescaped=CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'();:@ =+$$,/?%#[]",kCFStringEncodingUTF8);NSString*out=[NSStringstringWithString:(NSString*)escaped];CFRelease(escaped);//记得释放
CGImageRefnewImageRef=CGImageCreateWithImageInRect(sourceImageRef,rect);UIImage*newImage=[UIImageimageWithCGImage:newImageRef];
CGImageRefnewImageRef=CGImageCreateWithImageInRect(sourceImageRef,rect);UIImage*newImage=[UIImageimageWithCGImage:newImageRef];CGImageRelease(newImageRef);