0

以下のコードは非ARCコードです。誰かがそれをARCコードに変換する方法を教えてもらえますか。URLをエンコードするために使用しているときにメモリリークが発生します。

#import "NSString+EncodeURIComponent.h"

@implementation NSString (EncodeURIComponent)

+ (NSString*)stringEncodeURIComponent:(NSString *)string {
    return [((NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                (CFStringRef)string,
                                                                NULL,
                                                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                kCFStringEncodingUTF8)) autorelease];
}

@end

前もって感謝します..

4

1 に答える 1

3
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                            (__bridge CFStringRef)string,
                                            NULL,
                                            CFSTR("!*'();:@&=+$,/?%#[]"),
                                            kCFStringEncodingUTF8));

これにより、次のことが行われます。

  • を取り外しますautorelease
  • を使用して Core Foundation オブジェクトを ARC に渡しますCFBridgingRelease()。これにより、 のバランスが取れますCreate。原則として(実装ではありませんが)、Core Foundation が a を実行しCFRelease()、ARC が を実行しobjc_retain()ます。
  • _bridgeの使用にケースを追加しますstring。これは、ARC と Core Foundation の間で所有権を譲渡していないことをコンパイラに伝えます。Core Foundation に ARC 変数を使用させたいだけです。
  • CFSTR()一定の Core Foundation 文字列を作成するために使用します。NSStringこれは、定数を作成してから Core Foundation にブリッジ キャストするよりも便利です。

Transitioning to ARC Release Notesの「Managing Toll-Free Bridging」を参照してください。

于 2012-09-17T13:29:35.673 に答える