43

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

4 に答える 4

43

コメントで述べたように、ここで ARC と自動参照カウントの内容について話しても問題ないと思います。

__autoreleasingそのように使用するためのものではありません。間接的なオブジェクト参照 (NSError** など) を渡すために使用されます。4.3.4 writeback による out パラメータへの受け渡しを参照してください。

3.2.4 Bridged castsによると__bridge_transfer、関数は保持されたオブジェクトを返すので正しいですCFURLCreateStringByAddingPercentEscapes(名前に「create」が含まれています)。返されたオブジェクトの所有権を ARC に取得させ、リリース (またはこの場合は自動リリース) を挿入してバランスをとります。

__bridgeキャストoriginalstringも正しいので、ARC に特別なことをしてほしくありません。

于 2011-07-25T23:38:26.633 に答える
28

これは正しいバージョンであり、リークはありません。コメントで言うように__bridge_transfer、所有権をに転送NSObject (NSString)し、オブジェクトが保持されていると仮定しますCF Framework(メソッドCFURLCreateStringByAddingPercentEscapesはオブジェクトを返すretainedため、これが必要なものです)、メモリ管理を実行したくないセルフオブジェクトよりも。フラの役に立ちますように

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (__bridge CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
于 2012-02-16T10:45:00.177 に答える
2
-(NSString *) urlEncoded
{
    CFStringRef encodedCfStringRef = CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)self,NULL,(CFStringRef)@"!*'\"();@+$,%#[]% ",kCFStringEncodingUTF8 );
    NSString *endcodedString = (NSString *)CFBridgingRelease(encodedCfStringRef);
    return endcodedString;
}
于 2013-01-09T08:26:04.287 に答える
0

必要ありません__autoreleasing。正しい ARC 構文は次のとおりです。

- (NSString *)URLEncodedString
{
    return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                     (CFStringRef)self,
                                                                     NULL,
                                                                     (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                     kCFStringEncodingUTF8));
}
于 2014-11-04T12:27:32.197 に答える