Как освободить и повторно инициализировать одноэлементный класс? - PullRequest
7 голосов
/ 28 июня 2011

Возможно ли освободить объект класса?

У меня есть одноэлементный класс "singleton.h", у которого есть один экземпляр, и мы можем использовать его свойства в любых других контроллерах представления.

+(singleton *)sharedMethod{
static singleton *myInstance=nil;
if(myInstance ==nil){
myInstance=[[singleton alloc] init]; myInstace.str=@"hello";
}
return myInstance;
}

что я хочу знать: есть ли способ, которым мы можем освободить объект класса в любом из наших viewControllers ... и затем снова создать экземпляр нового одноэлементного класса ..., я попытался сделать это .., XCode выдает ошибку "не может освободить объект класса".

Ответы [ 4 ]

8 голосов
/ 28 июня 2011

Смысл синглтона в том, что вы никогда не освобождаете его. Другие классы могут сохранять указатель на экземпляр, поэтому, если вы захотите заменить его, вы получите странное поведение или даже иногда произойдет сбой. Так что не стоит этого делать.

Но это возможно, если вы не перезаписали методы release и retainCount. Но ваше цитируемое сообщение об ошибке, похоже, говорит о том, что вы сделали что-то вроде [MyClass release];, что, конечно, не работает.

Кстати, у вас, похоже, singleton в качестве имени класса. Пожалуйста, старайтесь придерживаться правил кодирования, используемых Apple, чтобы сделать вашу жизнь и жизнь других людей проще. Имена классов всегда должны начинаться с символа в верхнем регистре, имена методов всегда должны начинаться с символа в нижнем регистре.

2 голосов
/ 12 июля 2017

объявить

static YOUR_CLASS *shared = nil;
static dispatch_once_t oncePredicate; //very important for reinitialize.

использовать экземпляр

+ (instancetype)shared  {
    dispatch_once(&oncePredicate, ^{
        shared = [[self alloc] init];
    });
    return shared;
}

сбросить

+ (void)reset{
    @synchronized(self) {
        shared = nil;
        oncePredicate = 0;
    }
}

вы готовы идти √

0 голосов
/ 05 ноября 2014

Это решение помогло мне.Создайте отдельный метод для инициализации класса.

@implementation SomeManager

static id sharedManager = nil;

+ (void)initialize {
    if (self == [SomeManager class]) {
        sharedManager = [[self alloc] init];
    }
}

+ (id)sharedManager {
    return sharedManager;
}

@end

Источник: http://eschatologist.net/blog/?p=178

0 голосов
/ 28 июня 2011

Очень важно, если вы не освободите класс singleton , потому что это не рекомендуется до полного извинения вашего приложения.Смотрите это для дополнительной информации.Для повторной инициализации класса singleton вам нужно сделать то же самое, что вы делали в первый раз.

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