Aar*_*ger 6 objective-c core-foundation automatic-ref-counting
考虑这个简单的方法; 它是NSString上的一个类别.
- (NSString *)stringByUrlEncoding
{
CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);
NSString *returnString = (__bridge NSString *)newString;
CFRelease(newString);
return returnString;
}
Run Code Online (Sandbox Code Playgroud)
它的任务是把=成%3D等为URL编码,但是这不是有关这个问题.
关于内存管理的一些问题:
之后CFRelease(newString);被调用时,我仍然可以po newString在调试器中看到的字符串.这是否意味着它没有得到正确的解除分配?
当我将已铸造的CFStringRefs传递给CFURLCreateStringByAddingPercentEscapes的参数时((CFStringRef)self例如),我相信我不需要将它们存储到变量中,然后由于"免费桥接"而CFRelease它们.它是否正确?
如果它是CGImageRef而不是CFStringRef,#2的答案是否会改变?为什么CGImageRef有自己的CGImageRelease函数,但是没有CFStringRelease方法?
为了确保我的理解__bridge_transfer是正确的,这个修改后的代码是否相同?
- (NSString *)stringByUrlEncoding
{
CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);
NSString *returnString = (__bridge_transfer NSString *)newString;
// CFRelease(newString);
return returnString;
}
Run Code Online (Sandbox Code Playgroud)至于你的问题:
1)您没有足够的信息来知道是否newString应该被释放。例如,如果实际上不需要字符替换,则CFURLCreateStringByAddingPercentEscapes返回相当于[self retain];的内容是合理的。这只是一个例子。更广泛的一点是“你无法知道”。这里的正常方法是使用 Instruments 来查找堆增长和泄漏。欲了解更多信息,请谷歌“retainCount无用”(我不会在这里重复它。)
2)是的。
3)CGImageRef但是,据我了解,这不是免费桥接,并且CFRetain应该CFRelease可以工作。CFRelease这里和的区别CGImageRelease是 to 的参数CFRelease不能是NULL,而CGImageReleasewill 可以容忍NULL参数。
4)__bridge_transfer是此处使用的适当注释。这会将 +1 保留计数从 ARC 不处理的一侧“转移”到它处理的一侧。换句话说,__bridge_transfer只是告诉 ARC 它需要release为此指针创建一个调用,即使它从未生成过retain.
| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |