我已经在许多标准Apple API和开源自定义API中看到了一个对象可以声明为共享的。例如,方法NSUserDefaults
和[NSUserDefaults standardUserDefaults]
可以通过NSNotificationCenter
访问[NSNotificationCenter defaultCenter]
。我想知道如何在共享的应用程序中创建我的一个自定义对象,因此可以通过[MyObject sharedObject]
等方法访问该对象的当前实例?
我下载了一个具有此功能的应用程序,但是共享的对象仅声明了用于访问头文件(.h)中对象的当前实例的方法,并且在实现中没有实现该方法档案(.m)。
它说:
+ (GameObject *)sharedGameObject;
我知道加号意味着它是一个类方法,这意味着它不需要创建该类的实例,但无论如何都可以访问,例如CALayer
的{{1}}方法。
我将不胜感激任何帮助! 谢谢,
本
答案 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
@property (strong, nonatomic) GameObject *sharedGameObject;
Appdelegate.m
@synthesize sharedGameObject;
并使用
访问它Yourclass.m
myAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
user = delegate.sharedGameObject;