调用函数'CFURLCreateStringByAddingPercentEscapes'返回保留计数为 +1 的核心基础对象



我正在将我的项目转换为 ARC,Xcode 认为这里有内存泄漏,有人认为这有什么问题吗? 我没有写这段代码,所以我不熟悉 C 调用。

- (NSString*) URLEscaped
{
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                NULL,
                                (CFStringRef)self,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return encodedString;
}

在 ARC 下,您可以使用 __bridge_transfer 将返回字符串的内存管理传输到 ARC:

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

从文档中:

您可以通过多种方式获取对对象的引用使用核心基础。符合核心基金会的所有权策略,您需要知道您是否拥有返回的对象一个函数,以便您知道要对内存采取什么操作管理。核心基金会已建立命名约定它的功能可让您确定您是否拥有函数返回的对象。简而言之,如果函数名称包含单词"创建"或"复制",您拥有该对象。如果函数名称包含单词"Get",您不拥有该对象。

是的,你在那里泄露了CFString

最新更新