IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码

简介: <p style="border-width:0px; padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:8px; list-style:none; text-indent:2em; color:rgb(51,51,51); font-family:宋体; font-size:14px; line-heig

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);
目录
相关文章
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
458 4
|
11月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
347 3
|
iOS开发
url中带中文,ios报错问题
url中带中文,ios报错问题
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
878 0
|
安全 JavaScript PHP
URL百分号编码
URL百分号编码
|
iOS开发
iOS App Store 上传项目报错 缺少隐私政策网址 (URL) 解决方法
iOS App Store 上传项目报错 缺少隐私政策网址 (URL) 解决方法
iOS App Store 上传项目报错 缺少隐私政策网址 (URL) 解决方法
|
Java
dk1.8和jdk17底层对url参数的编码不一样吗
dk1.8和jdk17底层对url参数的编码不一样吗
215 0
|
JavaScript
URL编码中的escape、encodeURI和encodeURIComponent
URL编码中的escape、encodeURI和encodeURIComponent
409 1
|
JavaScript 前端开发
JS实现url的编码和解码
JS实现url的编码和解码
252 1
|
数据安全/隐私保护
URL编码解析方式-特殊字符加密和解密
URL编码解析方式-特殊字符加密和解密
301 0

热门文章

最新文章