zoukankan      html  css  js  c++  java
  • 使用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复制内容到剪贴板
    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 /

  • 相关阅读:
    wait 和 notify 方法
    synchronized关键字
    多线程之thread、runnable的区别
    CodeForces 213 E
    hdu 3038 并查集
    zoj 3349 dp + 线段树优化
    hdu 4419 线段树 扫描线 离散化 矩形面积
    hdu 4262(线段树)
    hfut 1287
    hdu 4747 (线段树)
  • 原文地址:https://www.cnblogs.com/langtianya/p/4886695.html
Copyright © 2011-2022 走看看