|
|
Log In | Not a Member? |
Contact ADC |
| < Previous PageNext Page > |
FoundationとApplication Kitのクラスの中には、シングルトンオブジェクトを作成するものがあります。シングルトンオブジェクトとは、現在のプロセスにおいて唯一存在が許されるクラスのインスタンスのことです。たとえば、NSFileManagerクラスやNSWorkspaceクラスは、プロセスが使用するシングルトンオブジェクトをインスタンス化します。これらのクラスのインスタンスを要求すると、唯一インスタンスへの参照が返されます。まだ存在していない場合は割り当てと初期化が行われます。
シングルトンオブジェクトは司令塔のような役割を果たし、クラスのサービスの指示や調整を行います。存在するインスタンスが理論上1つしかない場合(たとえばNSWorkspaceのような場合)は、複数のインスタンスではなくシングルトンインスタンスをクラスで生成してください。いずれ複数のインスタンスが存在する可能性があると考えられる場合は、ファクトリメソッドや関数ではなくシングルトンインスタンスを使用します。
シングルトンを作成する場合、コードの中でいくつかことを行う必要があります。
シングルトンオブジェクトの静的インスタンスを宣言し、nilに初期化する。
クラスのクラスファクトリメソッド(“sharedInstance”や“sharedManager”などの名前を付ける)では、静的インスタンスがnilの場合のみ、クラスのインスタンスを作成する。
allocWithZone:メソッドをオーバーライドし、クラスの使用者がクラスファクトリメソッドを使用せずにクラスのインスタンスを直接割り当てて初期化しようとしたときにほかのインスタンスが割り当てられないようにする。
基本プロトコルメソッドであるcopyWithZone:、release、retain、retainCount、およびautoreleaseを実装し、シングルトンの状態が保たれるように適切な処理を実行する。
シングルトンの実装例をListing 2-15に示します。
Listing 2-15 シングルトンの実装
static MyGizmoClass *sharedGizmoManager = nil; |
+ (MyGizmoClass*)sharedManager |
{ |
@synchronized(self) { |
if (sharedGizmoManager == nil) { |
[[self alloc] init]; // ここでは代入していない |
} |
} |
return sharedGizmoManager; |
} |
+ (id)allocWithZone:(NSZone *)zone { |
{ |
@synchronized(self) { |
if (sharedGizmoManager == nil) { |
sharedGizmoManager = [super allocWithZone:zone]; |
return sharedGizmoManager; // 最初の割り当てで代入し、返す |
} |
} |
return nil; // 以降の割り当てではnilを返すようにする |
} |
- (id)copyWithZone:(NSZone *)zone |
{ |
return self; |
} |
- (id)retain |
{ |
return self; |
} |
- (unsigned)retainCount |
{ |
return UINT_MAX; // 解放できないオブジェクトであることを示す |
} |
- (void)release |
{ |
// 何もしない |
} |
- (id)autorelease |
{ |
return self; |
} |
場合によっては、シングルトンインスタンスが必要であるものの(クラスファクトリメソッドで作成し管理します)、必要に応じて割り当てと初期化を通じて他のインスタンスを作成する機能も必要になることがあります。そのような場合は、Listing 2-15に示したようにallocWithZone:以降の各メソッドをオーバーライドしません。
| < Previous PageNext Page > |
Last updated: 2006-05-23
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |