目标c-ARC的正确桥接?

我有一个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;
}

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

原始代码:

- (NSString *)URLEncodedString
    NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                (CFStringRef)self,
                                NULL,
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                kCFStringEncodingUTF8);
    return [encodedString autorelease];
}
4个解决方案
43 votes

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

__bridge并非旨在那样使用。 它用于传递间接对象引用(NSError **等)。 请参阅4.3.4通过写回传递到out参数。

根据3.2.4桥接强制转换,__bridge是正确的,因为originalstring函数返回保留的对象(其名称中具有“ create”)。 您希望ARC拥有所返回对象的所有权,并插入一个发行版(在这种情况下为自动发行版)来平衡这一点。

originalstring铸造的__bridge也是正确的,您不希望ARC对它做任何特殊的事情。

Caffeine answered 2020-08-01T15:30:03Z
28 votes

这是一个正确的而不泄漏的版本。就像您在评论中所说的:__bridge_transfer将所有权转移到NSObject (NSString)并假定该对象由CF Framework保留(方法CFURLCreateStringByAddingPercentEscapes返回retained对象,因此这是我们需要的)而不是对self对象,我们不想执行任何内存管理。 希望能帮助到你弗拉

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (__bridge CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
Punty answered 2020-08-01T15:30:23Z
2 votes
-(NSString *) urlEncoded
{
    CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
    NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
    return endcodedString;
}
Shafraz Buhary answered 2020-08-01T15:30:39Z
0 votes

不需要__autoreleasing。 正确的ARC语法很简单:

- (NSString *)URLEncodedString
{
    return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                     (CFStringRef)self,
                                                                     NULL,
                                                                     (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                     kCFStringEncodingUTF8));
}
Rob answered 2020-08-01T15:31:00Z
translate from https://stackoverflow.com:/questions/6822473/correct-bridging-for-arc