UIFontのretainCount

[[UIFont systemFontOfSize:50] retainCount]が1をすっとばして2になる。
誰かが初めの1をしている。

状況を勝手にイメージすると
UIFontクラス内ですでに全てのサイズごとのインスタンスが用意されていて、それらはすでにretainCountが1。で、自作ソース内で使おうとすると、インスタンスを生成するのではなくてすでにあるものへの参照が渡され、retainCountを+1すると2になるような感じ。
あくまで勝手なイメージなので実際はこれとは誤差があると思います。

調べます。

調査プログラム
NSLog(@"%d",[[UIFont systemFontOfSize:50] retainCount]);
NSLog(@"%d",[[UIFont systemFontOfSize:50] retainCount]);
NSLog(@"%d",[[UIFont systemFontOfSize:50] retainCount]);
NSLog(@"%d",[[UIFont systemFontOfSize:50] retainCount]);
NSLog(@"%d",[[UIFont systemFontOfSize:50] retainCount]);
とやると
2
3
4
5
6
と出てきます。どうやらインスタンス(と呼ぶのかどうかわかりませんが)を使い回ししてます。


ちなみに
NSLog(@"%d",[[NSString stringWithFormat:@"abc"retainCount]);
NSLog(@"%d",[[NSString stringWithFormat:@"abc"retainCount]);
NSLog(@"%d",[[NSString stringWithFormat:@"abc"retainCount]);
NSLog(@"%d",[[NSString stringWithFormat:@"abc"retainCount]);
NSLog(@"%d",[[NSString stringWithFormat:@"abc"retainCount]);
なら
1
1
1
1
1
となります。

で、どうゆう状態でautoReleasePoolに入っているかよくわからないのですが、自作ソース内で+1した分はイベントループの最後できちんと-1はされるようです。
次のイベントループではまた1になっていて上のプログラムはまた2から順に出力されます。
気になったのでシミュレータで確かめましたが、普通のインスタンスでも、1つのインスタンスに複数回autoReleaseを送りpool破棄時にその分をマイナスすることはOK(可能)のようです。(当然retainとreleaseの回数は合わせておく)

UIFontの説明を調べました。
You do not create UIFont objects using the alloc and init methods. Instead, you use class methods of UIFont to look up and retrieve the desired font object. These methods check for an existing font object with the specified characteristics and return it if it exists. Otherwise, they create a new font object based on the desired font characteristics.
あなたはallocとinitメソッドを使用してUIFontオブジェクトを作成しないでください。代わりに、目的のフォントオブジェクトをルックアップして取得するUIFontのクラスメソッドを使用してください。これらのメソッドは、指定された特性を持つ既存のフォントオブジェクトをチェックし、それが存在する場合それを返します。そうでなければ、彼らは希望するフォントの特性に基づいて新しいフォントオブジェクトを作成します。

存在する場合とそうで無い場合の違いが疑問ですが大方予想とおりのようです。

他にもこんなクラスあるんでしょうか?

コメント

このブログの人気の投稿

Swiftのコンパイルエラー寄せ集め

Swift2.2からSwift3.0への変換を行ってみて

AVAudioSession細かいことまとめ(late 2014)