Каков наилучший способ поделиться экземпляром класса (создать и поделиться синглтоном)? - PullRequest
0 голосов
/ 26 сентября 2011

Я знаю 2 способа. Что лучше? И что лучше, чем 2 способа?

+ (MyClass *)shared {
    /*
    static MyClass *sharedInstance = nil;

    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[self alloc] init];
        }
    }
    return sharedInstance;
    */

    /*
    static dispatch_once_t pred;
    static MyClass *sharedInstance = nil;

    dispatch_once(&pred, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
    */ 
} 

Ответы [ 5 ]

6 голосов
/ 26 сентября 2011

Можно также создать экземпляр класса в AppDelegate и использовать его в любом месте вашего проекта.

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

appappDelegate.<yourClassInstance>
2 голосов
/ 26 сентября 2011

Вот еще один способ настроить ваш общий экземпляр.Безопасность потоков обеспечивается средой выполнения, и код очень прост.Обычно так я настраиваю свои синглтоны.Если одноэлементный объект использует много ресурсов, но может не использоваться, тогда подход dispatch_once работает хорошо.

static MyClass *sharedInstance = nil;

+ (void) initialize 
{
   sharedInstance = [[MyClass alloc] init];
}

+ (MyClass*)sharedInstance   
{
    return sharedInstance;
}
1 голос
/ 03 декабря 2013

Вот некоторые детали

+ (YourClass *)sharedInstance 
{
    // structure used to test whether the block has completed or not
    static dispatch_once_t p = 0;

    // initialize sharedObject as nil (first call only)
    __strong static id _sharedObject = nil;

    // executes a block object once and only once for the lifetime of an application
    dispatch_once(&p, ^{
        _sharedObject = [[self alloc] init];
    });

    // returns the same object each time
    return _sharedObject;
}
1 голос
/ 12 февраля 2013

Просто используйте версию dispatch_once - она ​​надежная и чистая. Кроме того, он будет работать и с ARC - в отличие от подхода, предложенного выше.

0 голосов
/ 26 сентября 2011

Второй выглядит лучше, но это все еще не идеально. Проверьте рекомендации Apple:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-97333-CJBDDIBI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...