正确桥接ARC?

Ste*_*ene 43 objective-c automatic-ref-counting

我有一个NSString的类别类.

@implementation NSString (URLEncode)

- (NSString *)URLEncodedString
{
    __autoreleasing NSString *encodedString;

    NSString *originalString = (NSString *)self;    
    encodedString = (__bridge_transfer NSString * )
            CFURLCreateStringByAddingPercentEscapes(NULL,
                                (__bridge CFStringRef)originalString,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return encodedString;
}
Run Code Online (Sandbox Code Playgroud)

我是否使用ARC和新LLVM的正确桥接传输?

原始代码:

- (NSString *)URLEncodedString
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                (CFStringRef)self,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return [encodedString autorelease];
}
Run Code Online (Sandbox Code Playgroud)

Caf*_*ine 43

正如评论中所提到的,我认为在这里讨论ARC和自动引用计数的内容是很好的.

__autoreleasing并不意味着像这样使用.它用于传递间接对象引用(NSError**等).请参见4.3.4通过回写传递给out参数.

根据3.2.4 Bridged强制转换,__bridge_transferCFURLCreateStringByAddingPercentEscapes函数返回一个保留对象(它的名称中有"create")时,它是正确的.您希望ARC获取返回对象的所有权并插入一个版本(在本例中为自动释放)以平衡此问题.

__bridge流延originalstring是正确的也一样,你不想ARC做什么特别的地方.

  • 我可以补充一点,使用`CFBridgingRelease()`宏使CFType对象的传输和消费更容易阅读 - 至少在我看来.例如`NSData*imageData = CFBridgingRelease(ABPersonCopyImageData(person))` (9认同)

Pun*_*nty 28

这是一个正确的,而不是泄漏的版本.正如您在评论中所说:__bridge_transfer将所有权转移到NSObject (NSString)并假设该对象被保留CF Framework(该方法CFURLCreateStringByAddingPercentEscapes返回一个retained对象,这就是我们需要的),而不是我们不想执行任何内存管理的自我对象.希望它有助于Fra

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (__bridge CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
Run Code Online (Sandbox Code Playgroud)