web-dev-qa-db-ja.com

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];
}
43
Stephan Keene

コメントで述べたように、ARCと Automatic Reference Counting の内容についてここで話しても問題ないと思います。

__autoreleasingはそのように使用することを意図していません。間接オブジェクト参照(NSError **など)を渡すために使用されます。 4.3.4ライトバックによる出力パラメーターへの引き渡し を参照してください。

.2.4ブリッジキャスト によると、__bridge_transferは正しいです。CFURLCreateStringByAddingPercentEscapes関数は保持されたオブジェクトを返します(名前に「create」が含まれています)。 ARCが返されたオブジェクトの所有権を取得し、リリース(この場合は自動リリース)を挿入して、これを調整します。

__bridgeoriginalstringのキャストも正しいので、ARCに特別なことをさせたくありません。

43
Caffeine

これは正しいバージョンで、リークはありません。コメントで言うとおり:__bridge_transfer所有権をNSObject(NSString)に譲渡し、オブジェクトがCF Frameworkによって保持されていると想定します(メソッドCFURLCreateStringByAddingPercentEscapes return retainedオブジェクトなので、これが必要です)、メモリ管理を実行したくないselfオブジェクトよりも。それがフラを助けることを願っています

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (__bridge CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
28
Punty
-(NSString *) urlEncoded
{
    CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
    NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
    return endcodedString;
}
2
Shafraz Buhary

番号 __autoreleasing必要です。正しいARC構文は次のとおりです。

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