Objective-c中的全局对象

时间:2013-01-06 04:17:58

标签: objective-c xcode oop

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

2 个答案:

答案 0 :(得分:1)

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

通过创建允许您访问特定全局实例的多个类方法,您可以轻松地为自己的类使用类似的模式。实际上,这实际上比制作一个 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: