この簡単な方法を考えてみましょう。NSStringのカテゴリです。
- (NSString *)stringByUrlEncoding
{
CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);
NSString *returnString = (__bridge NSString *)newString;
CFRelease(newString);
return returnString;
}
その仕事はURLエンコードなどに変えることですが、それはこの質問には関係ありません=
。%3D
メモリ管理に関するいくつかの質問:
CFRelease(newString);
が呼び出された後もpo newString
、デバッガーで文字列を確認できます。これは、適切に割り当てが解除されていないことを意味しますか?キャストされたCFStringRefをCFURLCreateStringByAddingPercentEscapesの引数に渡すと(
(CFStringRef)self
たとえば)、「フリーダイヤルブリッジ」のために、それらを変数に格納してからCFReleaseする必要はないと思います。これは正しいです?CFStringRefではなくCGImageRefの場合、#2の答えは変わりますか?CGImageRefに独自のCGImageRelease関数があるのに、CFStringReleaseメソッドがないのはなぜですか?
私の理解
__bridge_transfer
が正しいことを確認するために、この変更されたコードは同一ですか?- (NSString *)stringByUrlEncoding { CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8); NSString *returnString = (__bridge_transfer NSString *)newString; // CFRelease(newString); return returnString; }