Screenクラスを改良する。具体的にはシングルトンパターンでインスタンスを作り、それを使い回すようにした。
全画面の範囲は今まではクラスメソッドで取り出していた。
+ (NSRect)frame;
呼出し毎に範囲を計算していた。
これをやめてインスタンス化し、1度計算した値を使い回すようにした。
@interface Screen : NSObject {
NSRect _frame;
}
+ (Screen*)defaultScreen;
- (NSRect)frame;
実装はこんな感じ。
static Screen* _screen = nil;
+ (Screen*)defaultScreen
{
if (!_screen) {
_screen = [[Screen alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:_screen
selector:@selector(screenChanged:)
name:NSApplicationDidChangeScreenParametersNotification
object:nil];
[_screen update];
}
return _screen;
}
スクリーンの構成が変わった時を考慮して NSApplicationDidChangeScreenParametersNotification を受け取るようにしている。この通知を受け取ったら範囲を更新する。
- (void)screenChanged:(NSNotification *)notification
{
[self update];
}