2012年11月13日火曜日

NSStringのretainCountが異常な値になる件について

NSStringのretainCountをNSLogでデバッグ出力すると、たまに異常に高い値で返ってくることがあるのでそのメモ。

この原因については以下の記事で解説がされていました。

NSStringのretainCountが異常な値になる件 - iPhoneアプリ開発まっしぐら★

この原因は「オブジェクト定数」(クラス内定数)が関係していたようです。以下、上の参考記事から説明を抜粋します。

これってじつは参照カウンタが「2147483647」というよりは、オブジェクト定数だから解放しなくてもいいよというのを表す「NSIntegerのMAX値」だったのです。retainCountはreleaseされる度にデクリメントされて、これが0になるとメモリ自体が解放されるというカウンタの役割をしているのですが、文字列定数なんかは解放不要のものとしてretainCountとして「NSIntegerMax」を返すという規定みたいです。

このへんの話に近いことが、Appleの「NSObject Protocol Reference」にも記載されています。そこには「オブジェクトが解放しちゃいけないものなら、retainCountの戻り値はUINT_MAXにしろ」と書いてあります。

オブジェクト定数は解放が不要なため、NSIntegerの最大値が返る規定になっているみたいです。

参考記事

NSStringのretainCountが異常な値になる件 - iPhoneアプリ開発まっしぐら★

0 件のコメント:

コメントを投稿