7

この簡単な方法を考えてみましょう。NSStringのカテゴリです。

- (NSString *)stringByUrlEncoding
{
    CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);
    NSString *returnString = (__bridge NSString *)newString;
    CFRelease(newString);
    return returnString;
}

その仕事はURLエンコードなどに変えることですが、それはこの質問には関係ありません=%3D

メモリ管理に関するいくつかの質問:

  1. CFRelease(newString);が呼び出された後もpo newString、デバッガーで文字列を確認できます。これは、適切に割り当てが解除されていないことを意味しますか?

  2. キャストされたCFStringRefをCFURLCreateStringByAddingPercentEscapesの引数に渡すと((CFStringRef)selfたとえば)、「フリーダイヤルブリッジ」のために、それらを変数に格納してからCFReleaseする必要はないと思います。これは正しいです?

  3. CFStringRefではなくCGImageRefの場合、#2の答えは変わりますか?CGImageRefに独自のCGImageRelease関数があるのに、CFStringReleaseメソッドがないのはなぜですか?

  4. 私の理解__bridge_transferが正しいことを確認するために、この変更されたコードは同一ですか?

    - (NSString *)stringByUrlEncoding
    {
        CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);
        NSString *returnString = (__bridge_transfer NSString *)newString;
        // CFRelease(newString);
        return returnString;
    }
    
4

1 に答える 1

2

あなたの質問について:

1) 割り当てを解除する必要があるかどうかを判断するのに十分な情報がありませんnewString。たとえば、実際に文字の置換が必要ない場合、が;CFURLCreateStringByAddingPercentEscapesに相当するものを返すのは合理的です。[self retain]これはほんの一例です。より広いポイントは、「あなたは知ることができない」ということです。ここでの通常のアプローチは、Instruments を使用してヒープの成長とリークを探すことです。詳細については、Google で「retainCount useless」を検索してください (ここでは再ハッシュしません)。

2) はい。

3)CGImageRefただし、私が理解しているように、無料でブリッジされているわけではなく、機能するCFRetainはずCFReleaseです。CFReleaseここでのとの違いCGImageReleaseは、 へのパラメーターが であってはCFReleaseならないNULLのに対し、はパラメーターCGImageReleaseを許容NULLすることです。

4)__bridge_transferは、ここで使用する適切な注釈です。これにより、ARC が処理しない側から処理する側に +1 リテイン カウントが「転送」されます。別の言い方__bridge_transferをすればrelease、たとえretain.

于 2013-02-19T19:21:05.720 に答える