気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
iOSでURLエンコーディングをする際、CoreFoundationのCFURLCreateStringByAddingPercentEscapes()を
使われている方は多いと思います。

しかし、ARC環境で、これを使う場合、注意しないとメモリリークを引き起こしてしまいます。
メモリリークを発生させない使い方は以下です。

NSString *encodedText = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
                                      NULL,
                                      (__bridge CFStringRef)sourceText,	//元の文字列
                                      NULL,
                                      CFSTR("!*'();:@&=+$,/?%#[]"),
                                      CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

ポイントは戻り値を(__bridge_transfer NSString *)でキャストしていることです。
(__bridge NSString *)でキャストするとメモリリークが発生します。
Createという単語を含むCoreFoundationの関数を使用する場合、戻り値のオブジェクトの所有権を取得します。つまり、
CFRelease()を後でコールする必要があるということです。

__bridge_transferは戻り値のオブジェクトの所有権をARCに移譲するためのキーワードです。
これにより、CFRelease()を自分でコールしなくても、ARCが面倒を見てくれるようになります。

__bridgeでキャストすると、ARCへの所有権の移譲が行われないため、自分でオブジェクトを解放する必要があります。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/126-c11ebbdb

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。