Общие объекты Objective-C

Я видел во многих стандартных API Apple и пользовательских API с открытым исходным кодом, что объект может быть объявлен как общий. Например, NSUserDefaults доступен методом [NSUserDefaults standardUserDefaults], а NSNotificationCenter - методом [NSNotificationCenter defaultCenter]. Мне было интересно, как я могу сделать один из моих пользовательских объектов в приложении общим, чтобы к текущему экземпляру этого объекта можно было получить доступ с помощью такого метода, как [MyObject sharedObject]?

Я загрузил приложение с этой функциональностью, но объект, к которому был предоставлен общий доступ, только объявил метод, используемый для доступа к текущему экземпляру объекта в файле заголовка (.h), и не было реализации метода в файле реализации (. м).

Он заявил об этом, сказав:

+ (GameObject *)sharedGameObject;

Я знаю, что плюс означает, что это метод класса, а это означает, что он не требует создания экземпляра этого класса, но к нему можно получить доступ в любом случае, как метод CALayer [CALayer layer].

Буду признателен за любую помощь! Спасибо,

Бен


person GravityScore    schedule 07.03.2012    source источник


Ответы (5)


Делайте так:

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

Кстати, [слой CALayer] НЕ предназначен для доступа к объекту общего слоя. Он создает новый автоматически выпущенный экземпляр CALayer.

person Community    schedule 07.03.2012
comment
Готово, IIRC для этой цели предназначено ключевое слово @synchronized. - person ; 07.03.2012
comment
Я бы заменил synchronized(shared) на synchronized(self). - person zoul; 07.03.2012

Шаблон проектирования, о котором вы говорите, называется Singleton, и теперь, когда вы знаете, что искать, вы сможете найти много информации об этом. Существует множество способов реализации этого шаблона в Objective-C, и на самом деле наиболее полезный, на мой взгляд, технически не является синглтоном.

person Jim    schedule 07.03.2012

Это называется шаблоном Singleton, и, на мой взгляд, это не очень хорошая идея с точки зрения дизайна (несмотря на примеры Apple). Вот некоторое обоснование против неправильного использования синглтона, а вот пример проекта Xcode, показывающий, как обмениваться объектами без синглетонов.

person zoul    schedule 07.03.2012

Apple рекомендует использовать dispatch_once для правильного поточно-ориентированного распределения синглетонов.

+ (MyObject*) sharedObject {
    static MyObject* sharedInstance;
    static dispatch_once_t once;
    dispatch_once(&once, ^ {
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}
person Drew H    schedule 11.11.2013
comment
Это то, что люди из Apple делают в ResearchKit с открытым исходным кодом. +1 - person Renfei Song; 19.05.2015