为什么我在CFURLCreateStringByAddingPercentEscapes中有可能泄漏?

时间:2011-07-14 16:38:11

标签: iphone memory-leaks

我的代码是:

NSString *buffer = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)name, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);

NSString *totalString = [NSString stringWithFormat:@"buffer/%@", buffer];

我运行了“构建和分析工具”并看到:“在第979行分配并存储到'缓冲区'中的对象在此点之后不再被引用,并且保留计数为+1(对象泄漏)”。

为什么CFURLCreateStringByAddingPercentEscapes可能会发生泄密?

5 个答案:

答案 0 :(得分:5)

在ARC下,您应该使用__bridge_transfer:

传输返回值的内存管理
    NSString *buffer = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)name, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);

答案 1 :(得分:1)

如果您查看this,您会看到您正在分配,因为该方法中包含Create但不放弃字符串的所有权。

发布您拥有的内容并拥有buffer。添加,

[buffer release];
获得totalString

答案 2 :(得分:1)

这是因为“创建规则”:

  

Core Foundation函数的名称表明您拥有的时间   返回的对象:

     
      
  • 在名称中嵌入“创建”的对象创建函数;
  •   
  • 在名称中嵌入“复制”的对象复制功能。
  •   
     

如果您拥有一个对象,那么当您完成它后,您有责任放弃所有权(使用CFRelease)。

答案 3 :(得分:0)

可能发生的情况是,分析仪会在一行中给出错误,在您的情况下为979,但其引用的对象实际上位于其上方

在没有看到你的代码的情况下,我无法确定,但是读了几行,可能会看到错误实际来自哪里,而XCode只看到了泄密的地方

答案 4 :(得分:0)

CFURLCreateStringByddingPercentEscapes创建一个ref count为+1的字符串,因此你需要释放缓冲区(或自动释放)以免泄漏..