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

推荐答案

正如 comments 中提到的,我认为在这里谈论ARC和Automatic Reference Counting的内容是可以的.

__autoreleasing不应该这样使用.它用于传递间接对象引用(NSError**,等等).见4.3.4 Passing to an out parameter by writeback.

根据3.2.4 Bridged casts__bridge_transfer是正确的,因为CFURLCreateStringByAddingPercentEscapes函数返回一个保留对象(其名称中有"create").您希望ARC获得返回对象的所有权,并插入一个释放(在本例中是自动释放)来平衡这一点.

originalstring__bridge投法也是正确的,你不想让ARC对此做任何特别的事情.

Objective-c相关问答推荐

警告:格式字符串不是字符串文字(可能不安全)

让 NSRunLoop 等待设置标志的最佳方法?

Xcode 中架构的重复符号

使用 CALayer 时无法编译代码

为什么当我使其处于非活动状态时,弱 IBOutlet NSLayoutConstraint 变为 nil?

将长按手势和拖动手势结合在一起

更改 UINavigationBar 字体属性?

iOS中CALayer的UIImage

滚动 NSScrollView 时的回调?

静态 NSString 使用与内联 NSString 常量

UILabel 的角半径属性在 iOS 7.1 中不起作用

访问当前视图的父视图 - iOS

在Objective-C中替换字符串中的一个字符

WKWebView 判断 JavaScript 返回值

AdMob 因 [GADObjectPrivate changeState:] 崩溃:无法识别的 Select 器

Xcode:无法判断应用程序包

UIView: opaque vs. alpha vs. opacity

zoom UIView 及其所有子项

字符串常量和字符串文字有什么区别?

UICollectionView:如何检测滚动何时停止