zoukankan      html  css  js  c++  java
  • CFURLCreateStringByAddingPercentEscapes与CFURLCreateStringByReplacingPercentEscapesUsingEncoding

    iOS中访问HTTP资源需要对URL进行Encode才能正确访问。

    OC中有方法:

    - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;

    例如:

    NSString *url=@"http://unmi.cc?p1=%+&sd &p2=中文";

    NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    结果是:

    http://unmi.cc?p1=%25+&sd%20&p2=%E4%B8%AD%E6%96%87

    但是仍不能转换URL中的?%&符号,我们需要单独编码参数,然后再拼接成URL之前将属性参数值中的?%&等符号分别替换成相应的编码。

    也可以用以下方式单独编码参数值,然后拼接成完整的URL:

    方法:/* newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, origString, NULL, NULL, kCFStringEncodingUTF8); */

    CF_EXPORT
    CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

    CoreFoundation里面的CFStringRef和NSString*是可以直接转换的,两种也都有一个相似的用来直接赋常量的操

    作。例如:

    CFStringRef a = CFSTR("a");
    NSString *b = @"b";

    CFSTR是一个宏,这个宏的定义可能是CFStringMakeConstantString,也可能是__builtin___CFStringMakeCo-

    nstantString。如果是CFStringMakeConstantString,看看CFStringMakeConstantString的实现就会明白,

    CFSTR("a")是存放在一个全局字典里面的,下次用到CFSTR("a")的时候先查字典里面有没有,如果有就是用存

    在的,如果没有则分配一个,并且放到字典里面。

    所以这里有两个需要注意的,一:CFSTR分配出来的字符串对象是不能自己释放的,如果你释放了下次在使用就

    会使用到一个野对象;二:多线程使用可能会出问题,因为全局的字典是没有锁的。

    而NSString的@有些不一样,应该和__builtin___CFStringMakeConstantString有些类似,允许你多线程使用,

    同样也不需要你自己去release,可以理解为b是一个autorelease的对象,系统会自己自动收回b。如果想长时间持

    有b那就retain,但不要忘了release。

  • 相关阅读:
    泛在电力物联网建设路线
    如何建设泛在电力物联网?
    泛在电力物联网到底该怎么建?
    泛在电力物联网(能源互联网+物联网)浅析
    泛在电力物联网分析—架构形式
    泛在电力物联网:两个业务 两种发展逻辑
    国网“泛在电力物联网”的战略与逻辑
    MVC中使用Hangfire按秒执行任务
    hangfire 实现已完成的job设置过期,防止数据无限增长
    解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"
  • 原文地址:https://www.cnblogs.com/encoreMiao/p/6237755.html
Copyright © 2011-2022 走看看