-2

我应该如何创建一个对象的多个全局实例?据我了解,(如果我错了,请原谅我)单身人士只会让我创建一个类的实例。

4

2 回答 2

1

有许多 Cocoa 类公开了全局实例,但从只能是其中一个的意义上说,它们并不是真正的单例。例如考虑NSTimeZone。有全局可访问的实例,如localTimeZonedefaultTimeZonesystemTimeZone,但您也可以根据需要创建任意数量的附加时区对象。

通过创建多个允许您访问特定全局实例的类方法,您可以轻松地为您自己的类使用类似的模式。事实上,这实际上比创建一个阻止创建多个实例的真正单例更容易。

于 2013-01-06T04:27:05.790 回答
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#importPFXObject.hsharedObjectForKey:@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);
    }
}
于 2013-01-06T05:09:26.470 回答