Jac*_*nkr 2 memory-management ios automatic-ref-counting cftypes
- (NSString*)encodeURL:(NSString *)string
{
NSString *newString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
if (newString)
{
return newString; // <-- potential leak here
}
return @"";
}
Run Code Online (Sandbox Code Playgroud)
我不熟悉CFTypes(除了知道它们是什么).这是我从互联网上得到的代码,并且不得不努力使其在ARC中运行.我有潜在的泄漏警告,我不知道如何解决它.建议?
是的,这是内存泄漏.你的意思是使用CFBridgingRelease()而不是__bridge.
创建的对象CFURLCreateStringByAddingPercentEscapes有一个额外的保留,因为它包括Create.您需要将该对象转移到ARC,让它知道添加额外的版本,这就是做什么CFBridgingRelease().
NSString *newString =
CFBridgingRelease(
CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(__bridge CFStringRef)string,
NULL,
CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),
kCFStringEncodingUTF8));
Run Code Online (Sandbox Code Playgroud)
您确实使用__bridge传入的字符串,因为您没有将其传输到Core Foundation.您只是要求Core Foundation使用它,而ARC继续拥有它.当您"转移"所有权时,通常意味着"此对象曾经是Core Foundation,现在它是ARC"(反之亦然).这就是发生的事情newString.
我将长NS-to-CF编码函数换成了结果,只是为了缩短它.
| 归档时间: |
|
| 查看次数: |
1187 次 |
| 最近记录: |