Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< Previous PageNext Page >

シングルトンインスタンスの作成

FoundationとApplication Kitのクラスの中には、シングルトンオブジェクトを作成するものがあります。シングルトンオブジェクトとは、現在のプロセスにおいて唯一存在が許されるクラスのインスタンスのことです。たとえば、NSFileManagerクラスやNSWorkspaceクラスは、プロセスが使用するシングルトンオブジェクトをインスタンス化します。これらのクラスのインスタンスを要求すると、唯一インスタンスへの参照が返されます。まだ存在していない場合は割り当てと初期化が行われます。

シングルトンオブジェクトは司令塔のような役割を果たし、クラスのサービスの指示や調整を行います。存在するインスタンスが理論上1つしかない場合(たとえばNSWorkspaceのような場合)は、複数のインスタンスではなくシングルトンインスタンスをクラスで生成してください。いずれ複数のインスタンスが存在する可能性があると考えられる場合は、ファクトリメソッドや関数ではなくシングルトンインスタンスを使用します。

シングルトンを作成する場合、コードの中でいくつかことを行う必要があります。

シングルトンの実装例を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




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
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