Почему ты все это делаешь? Если вы пытаетесь применить одноэлементное поведение в суперклассе, переопределяя -retain
, -release
, -retainCount
и +allocWithZone:
, то вы делаете что-то совершенно ненужное. Гораздо проще просто предоставить метод +sharedInstance
и больше ничего не делать. Если пользователь действительно хочет позвонить +alloc
/ -init
, он может, это просто не принесет им пользы. Для примеров этого типа синглтона в каркасах посмотрите NSUserDefaults
и NSFileManager
(хотя в случае последнего, в эти дни Apple фактически рекомендует вам игнорировать общий экземпляр и выделять / инициализировать ваши собственные экземпляры NSFileManager
).
Чтобы выполнить эту простую работу с общими экземплярами, все, что вам нужно сделать, это реализовать в классе singleton следующее:
+ (id)sharedInstance {
static MyClass sharedInstance;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
//sharedInstance = [[MyClass alloc] init];
sharedInstance = [MyClass alloc];
sharedInstance = [sharedInstance init];
});
return sharedInstance;
}