2
- (NSString*)encodeURL:(NSString *)string
{
    NSString *newString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

    if (newString) 
    {
        return newString; // <-- potential leak here
    }

    return @"";
}

私はCFTypesに精通していません(それらが何であるかを知っている以外は)。これは私がインターネットから入手したコードで、ARC で動作させるために少し手を加える必要がありました。リークの可能性があるという警告が表示されましたが、修正方法がわかりません。提案?

4

3 に答える 3

8

はい、これはメモリ リークです。CFBridgingRelease()ではなく使用するつもり__bridgeでした。

によって作成されたオブジェクトにCFURLCreateStringByAddingPercentEscapesは、 が含まれているため、追加の保持がありますCreate。そのオブジェクトを ARC に転送し、追加のリリースを追加するように知らせる必要がありCFBridgingRelease()ます。

NSString *newString = 
    CFBridgingRelease(
        CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                                               (__bridge CFStringRef)string, 
                                               NULL,
                                               CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),           
                                               kCFStringEncodingUTF8));

__bridgeCore Foundationに転送していないため、渡された文字列に使用します。ARCが引き続き所有している間、Core Foundationにそれを使用するように依頼しているだけです. 所有権を「譲渡」するときは、通常、「このオブジェクトは以前は Core Foundation でしたが、現在は ARC です」(またはその逆) を意味します。それが に起こっていることnewStringです。

長い NS-to-CF エンコーディング関数を結果と交換して、短くしました。

于 2012-05-02T00:40:39.167 に答える
0

文字列の自動解放されたバージョンを返します。CFStringRef変換することNSStringも、その逆も可能です。これは、通常のように処理してNSString自動解放できることも意味します (これに興味がある場合は、 と の部分間の無料のブリッジングについて読む必要がありますFoundation) Core Foundation)

于 2012-05-02T00:39:55.270 に答える