考虑这个简单的方法;它是 NSString 上的一个类别。
- (NSString *)stringByUrlEncoding
{
CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);
NSString *returnString = (__bridge NSString *)newString;
CFRelease(newString);
return returnString;
}
它的工作是为 URL 编码=
转换成%3D
等,但这与这个问题无关。
关于内存管理的几个问题:
调用后
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; }