共享的Objective-C对象

时间:2012-03-07 08:03:36

标签: objective-c nsnotificationcenter shared-objects

我已经在许多标准Apple API和开源自定义API中看到了一个对象可以声明为共享的。例如,方法NSUserDefaults[NSUserDefaults standardUserDefaults]可以通过NSNotificationCenter访问[NSNotificationCenter defaultCenter]。我想知道如何在共享的应用程序中创建我的一个自定义对象,因此可以通过[MyObject sharedObject]等方法访问该对象的当前实例?

我下载了一个具有此功能的应用程序,但是共享的对象仅声明了用于访问头文件(.h)中对象的当前实例的方法,并且在实现中没有实现该方法档案(.m)。

它说:

+ (GameObject *)sharedGameObject;

我知道加号意味着它是一个类方法,这意味着它不需要创建该类的实例,但无论如何都可以访问,例如CALayer的{​​{1}}方法。

我将不胜感激任何帮助! 谢谢,

5 个答案:

答案 0 :(得分:4)

这样做:

static id shared = NULL;
+ (id)sharedInstance
{
    @synchronized(self) {
        if (shared == NULL)
        {
            shared = [[self alloc] init];
        }
    }
    return shared;
}

顺便说一句,[CALayer图层]不是用于访问共享图层对象。它创建了一个新的自动释放的CALayer实例。

答案 1 :(得分:3)

您所指的设计模式称为Singleton,如果您知道要搜索的内容,您将能够找到关于此的 lot 信息。在Objective-C中有很多方法可以实现这种模式,事实上the most useful在我看来实际上并不是单身人士。

答案 2 :(得分:1)

它被称为Singleton模式,在我看来,设计方面并不是一个好主意(尽管有Apple的例子)。这是some rationale against singleton misuse,这里是sample Xcode project,显示了如何在没有单身人士的情况下共享对象。

答案 3 :(得分:1)

Apple建议使用dispatch_once进行正确的线程安全分配单例

+ (MyObject*) sharedObject {
    static MyObject* sharedInstance;
    static dispatch_once_t once;
    dispatch_once(&once, ^ {
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

答案 4 :(得分:-1)

您正在搜索名为 Singleton Wiki的设计模式。它由Gang of Four(GOF)Wiki组成,有助于保持对象的存活并通过其他实例访问。您已经可以使用模板:Template

MVC模式也可以完成你的工作,只需初始化

Appdelegate.h

Appdelegate.h

@property (strong, nonatomic) GameObject *sharedGameObject;

Appdelegate.m

@synthesize sharedGameObject;

在ApplicationsDelegate中

并使用

访问它

申请代表

YourClass

Yourclass.m

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; user = delegate.sharedGameObject;