我的代码是:
NSString *buffer = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)name, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
NSString *totalString = [NSString stringWithFormat:@"buffer/%@", buffer];
我运行了“构建和分析工具”并看到:“在第979行分配并存储到'缓冲区'中的对象在此点之后不再被引用,并且保留计数为+1(对象泄漏)”。
为什么CFURLCreateStringByAddingPercentEscapes
可能会发生泄密?
答案 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的字符串,因此你需要释放缓冲区(或自动释放)以免泄漏..