我应该如何创建一个对象的多个全局实例?据我了解,(如果我错了,请原谅我)单身人士只会让我创建一个类的实例。
2 回答
有许多 Cocoa 类公开了全局实例,但从只能是其中一个的意义上说,它们并不是真正的单例。例如考虑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);
}
}