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 /

使用CFURLCreateStringByAddingPercentEscapes进行URL编码相关推荐

  1. iOS端URL编码和解码过程

    一.URL含义 1.URL定义 URL 是Uniform Resource Locator 的缩写,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址 ...

  2. iOS常用方法——URL编码和URL解码

    URL编码是一种常见的编码方式,作用不多说,直接上代码. URL编码: - (NSString *)URLEncodedString {// CharactersToBeEscaped = @&quo ...

  3. OC URL编码和URL解码

    URL编码是一种常见的编码方式,作用不多说,直接上代码. URL编码: - (NSString *)URLEncodedString {// CharactersToBeEscaped = @&quo ...

  4. JS 中 URL 编码的问题.

    URL 编码 为什么要对 URL 编码 1. 避免解析错误 我们的 queryString 的形式是使用 ?开始, key=value 传递参数, key-value pairs 之间使用 & ...

  5. PHP--------解决网址URL编码问题

    2019独角兽企业重金招聘Python工程师标准>>> 在PHP中有urlencode().urldecode().rawurlencode().rawurldecode()这些函数 ...

  6. URL编码以及GET和POST提交乱码解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 1.  什么是URL编码. URL编码是一种浏览器用来打包表单输入的格式,浏览器从表单中获取所有的name和其对应的value ...

  7. java url加密解密,java URL 编码解码,该如何解决

    java URL 编码解码 我写了两个接口 一个是对字符串加密 的,一个是解密的  .加密的可以通过调用接口生成加密字符串如下: Oc0PEwKrLzHqT25hYLhWP5wlk5HROPJoWC3 ...

  8. Google App Engine for Java下的URL编码转换问题

    URL编码问题 此部分参考英文资料: http://www.blooberry.com/indexdot/html/topics/urlencoding.htm http://www.w3school ...

  9. URL编码将“&”(&符号)视为“&”HTML实体

    本文翻译自:URL encode sees "&" (ampersand) as "&" HTML entity I am encoding a ...

最新文章

  1. 胡想——对机器人控制体系的一些想法
  2. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)
  3. 超干货 | 泰勒图(Taylor diagram)绘制方法大汇总
  4. mysql 查询设置调优_MySQl 查询性能优化相关
  5. web农行支付php示例,ecshop,shopex完美实现农业银行(农行)在线支付接口
  6. 自定义的plot函数参数date坐标模型[x,y]的使用建议
  7. PAT乙级(1036 跟奥巴马一起编程)
  8. 【干货】JS 限制input文本框输入
  9. 3.redis集群部署3主3从
  10. python math库基本函数
  11. stbc 多发送天线 matlab,系统天线论文,关于基于STBC的MIMO-OFDM系统误码性能仿真相关参考文献资料-免费论文范文...
  12. 今天不学习,明天变垃圾
  13. SMART硬盘检测参数详解
  14. 深入理解朴素贝叶斯(Naive Bayes)
  15. [Angular] ng-alain的一些实践
  16. 全网疯传!微信发原图暴露个人信息?微信高冷回应!真相来了...
  17. 浅谈mysql的执行计划是何方神圣
  18. Mac多版本jdk的切换
  19. 英语不好可以学python_想学Python这个,英语基础不好,可以学会吗?
  20. OVS 内核CT实现

热门文章

  1. mysql 求数据的长度_mysql 如何求数据的长度
  2. wampserver环境配置局域网访问
  3. 基于 tcp协议完成的上传下载
  4. 洛谷 1359 租用游艇
  5. 虚拟机VMware操作系统安装
  6. Django项目之小博客
  7. [转] Linux GCC 编译使用
  8. Mysql函数:Last_insert_id()语法讲解
  9. Java Scoket之java.io.EOFException解决方案
  10. Java中为什么需要反射?反射要解决什么问题?