我应该如何创建对象的多个全局实例?根据我的理解,(并且如果我错了就原谅我),单身人士只会让我创建一个类的实例。
答案 0 :(得分:1)
有许多Cocoa类可以公开全局实例,但在某些意义上它们不是真正的单例,只能是其中之一。例如,考虑NSTimeZone
。有全局可访问的实例,例如localTimeZone
,defaultTimeZone
和systemTimeZone
,但您也可以根据需要创建任意数量的其他时区对象。
通过创建允许您访问特定全局实例的多个类方法,您可以轻松地为自己的类使用类似的模式。实际上,这实际上比制作一个 true 单例更容易,这会阻止创建多个实例。
答案 1 :(得分:0)
听起来你想要这样的东西,假设有问题的类被称为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
),并确保声明类方法({{1 }})在该文件的sharedObjectForKey:
中:
@interface
修改:示例
以下示例程序演示了如何使用//PFXObject.h
@interface PFXObject : NSObject
//...
+ (PFXObject *)sharedObjectForKey:(id<NSCopying>)theKey;
//...
@end
PFXObject
+sharedObjectForKey: