オブジェクトの複数のグローバル インスタンスを作成するにはどうすればよいですか? 私が理解していることから(間違っていれば許してください)、シングルトンではクラスのインスタンスを1つしか作成できません。
2 に答える
グローバル インスタンスを公開する Cocoa クラスは多数ありますが、そのうちの 1 つしか存在できないという意味で、真のシングルトンではありません。NSTimeZone
たとえば、考えてみましょう。localTimeZone
、defaultTimeZone
、 などのグローバルにアクセス可能なインスタンスがありますがsystemTimeZone
、追加のタイム ゾーン オブジェクトを好きなだけ作成することもできます。
特定のグローバル インスタンスにアクセスできる複数のクラス メソッドを作成することで、独自のクラスに同様のパターンを簡単に使用できます。実際、これは、複数のインスタンスの作成を防ぐ真のシングルトンを作成するよりも簡単です。
問題のクラスが呼び出されると仮定すると、次のようなものが必要なようですPFXObject
。
static NSMutableArray *sharedObjects = nil;
+ (PFXObject *)newSharedObjectAtIndex:(NSUInteger *)indexOut
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedObjects = [NSMutableArray array];
});
NSUInteger index = 0;
PFXObject *newObject = [[PFXObject alloc] init];
@synchronized(sharedObjects) {
[sharedObjects addObject:newObject];
index = sharedObjects.count - 1;
}
if (indexOut) {
*indexOut = index;
}
return newObject;
}
+ (PFXObject *)sharedObjectAtIndex:(NSUInteger)index
{
PFXObject *object = nil;
@synchronized(sharedObjects) {
object = [sharedObjects objectAtIndex:index];
}
return object;
}
これにより、必要な数の共有インスタンスを作成PFXObject
し、インデックスで取得できます。または、辞書を使用することもできます。
static NSMutableDictionary *sharedObjects = nil;
+ (PFXObject *)sharedObjectForKey:(id<NSCopying>)key
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedObjects = [NSMutableDictionary dictionary];
});
PFXObject *object = nil;
@synchronized(sharedObjects)
{
if (!(object = sharedObjects[key])) {
object = [[PFXObject alloc] init];
sharedObjects[key] = object;
}
}
return object;
}
これにより、任意の数の共有オブジェクトを保持し、それぞれを選択したキーに関連付けることができます。
編集:あなたが書いた
これを使用してオブジェクトを初期化する方法を説明できますか
このメカニズムを使用するには、次のように記述します。
PFXObject *sharedObject = [PFXObject sharedObjectForKey:theKey];
共有オブジェクトを使用したい場所のどこでもPFXObject
、キーtheKey
(を実装NSCopying
し、(ほぼ確実に) オーバーライドするクラスのインスタンス) に対応する共有を取得します。-hash
共有インスタンスを使用するファイルで行う必要があるのは#import
、適切なヘッダー ファイル (この場合は ) だけであり、そのファイルでクラス メソッド ( )PFXObject.h
を宣言する必要があります。sharedObjectForKey:
@interface
//PFXObject.h
@interface PFXObject : NSObject
//...
+ (PFXObject *)sharedObjectForKey:(id<NSCopying>)theKey;
//...
@end
編集:例
次のサンプル プログラムは、共有PFXObject
を使用してインスタンス化する方法を示しています。+sharedObjectForKey:
@interface PFXObject : NSObject
+ (PFXObject *)sharedObjectForKey:(id<NSCopying>)key;
@end
@implementation PFXObject
static NSMutableDictionary *sharedObjects = nil;
+ (PFXObject *)sharedObjectForKey:(id<NSCopying>)key
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedObjects = [NSMutableDictionary dictionary];
});
PFXObject *object = nil;
@synchronized(sharedObjects)
{
if (!(object = sharedObjects[key])) {
object = [[PFXObject alloc] init];
sharedObjects[key] = object;
}
}
return object;
}
@end
int main(int argc, char *argv[])
{
@autoreleasepool {
PFXObject *sharedObject = [PFXObject sharedObjectForKey:@"key"];
NSLog(@"%@", sharedObject);
}
}