В target-C (ios) кто-нибудь использовал экземпляр синглтона? - PullRequest
0 голосов
/ 21 марта 2012

С точки зрения памяти экземпляра синглтона, как мы можем удалить созданный экземпляр сингтона, если он помещен в пул авто-релиза?

Ответы [ 6 ]

3 голосов
/ 21 марта 2012

Экземпляр Singleton не должен быть помещен в пул автоматического выпуска.Экземпляр синглтона должен быть создан один раз (обычно при первой ссылке) и удален при завершении приложения (я имею в виду автоматически под iOS).Вот почему синглтон обычно назначается статической переменной.

Вы должны увеличить счетчик ссылок (сохранить) экземпляр синглтона при назначении этой статической переменной.На этом этапе, даже если вы добавите его в пул автоматического выпуска, он не будет удален, так как он уже сохранен где-то еще.

Чтобы удалить этот экземпляр singleton, вам просто нужно освободить текущий объект, назначенный статическомупеременная (например, релиз) и назначить ноль или создать новый синглтон.Если тот же экземпляр был добавлен в пул автоматического выпуска, он не будет удален немедленно, только после того, как этот пул автоматического выпуска был удален сам.Но это не должно сильно измениться в вашем приложении, так как синглтон уже равен нулю или воссоздан как новый экземпляр, поэтому любые дальнейшие вызовы будут извлекать новый экземпляр.добавил бы синглтон к пулу авто-релиза.Пожалуйста, поделитесь фрагментом кода, если он не отвечает на ваш вопрос.

1 голос
/ 21 марта 2012

Есть некоторые споры о том, как создать синглтон. Я использую следующий шаблон:

+ (MYSingletonClass *) sharedInstance
{
    static dispatch_once_t onceToken;
    static MYSingletonClass * __sharedInstance = nil;

    dispatch_once(&onceToken, ^{
        __sharedInstance = [[self alloc] init];
    });

    return __sharedInstance;
}

По разъяснениям ОП выясняется, что это не отвечает на вопрос, но я все равно поделился:)

См. этот пост сравнение @synchronized v dispatch_once

1 голос
/ 21 марта 2012

см. Ссылку

http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

Apple кратко объяснила это здесь. В разделе «Создание экземпляра синглтона»

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html

0 голосов
/ 21 марта 2012

возможно, вы можете добавить «очистить» метод к вашему одноэлементному объекту, если вам нужно очистить его содержимое ...

0 голосов
/ 21 марта 2012
static id sharedInstance=nil;

+(id)sharedInstance 
{
    @synchronized(self) 
    {
        if(!sharedInstance)
       {
           NSLog(@"Allocated");
           sharedInstance = [[self alloc] init];
       }
   }
   return sharedInstance;
}
//standard way to declare singleton object
0 голосов
/ 21 марта 2012

Насколько я знаю, Singletons полезны, потому что вы NOT отпускаете их, пока ваше приложение не будет закрыто. Так что ваши данные всегда доступны.

Если вам нужно освободить память, я предлагаю вам найти другой способ управления данными ...

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