Comments 10
А если Ваше приложение много поточное, то могут возникнуть проблемы.
Для их решения лучше сделать так
так уж точно один раз.
Для их решения лучше сделать так
+(Singleton *) sharedInstance
{
static Singleton * sharedInstance= nil;
static dispatch_once_t once_token = 0;
dispatch_once(&once_token, ^
{
sharedInstance = [Singleton new];
});
return sharedInstance ;
}
так уж точно один раз.
+7
А по поводу наследников — нужно использовать instancetype.
+5
Всё хорошо, но на практике полная реализация крайне громоска.
Я использую реализацию без перегрузки управления памятью. Пока ещё никто его внепланово убить не пытался.
Я использую реализацию без перегрузки управления памятью. Пока ещё никто его внепланово убить не пытался.
-2
еще, вот тут habrahabr.ru/post/198328/#comment_6879124 недавно поговорили о синглтонах.
Кратко, смысл в том, что о синглтоне, как паттерне, надо думать в последнюю очередь.
Кратко, смысл в том, что о синглтоне, как паттерне, надо думать в последнюю очередь.
+1
Описанная вами версия — только для не ARC'овых проектов. Все-таки 2014 год на подходе. Все можно сделать проще и изящнее:
@interface MySingleton : NSObject
+(instancetype) sharedInstance;
// следующие объявления сгенерируют compile time ошибки при попытке их вызвать вручную.
// добавляем -copyWithZone: -allocWithZone: -copy по вкусу
+(instancetype) alloc __attribute__((unavailable("alloc not available, call sharedInstance instead")));
-(instancetype) init __attribute__((unavailable("init not available, call sharedInstance instead")));
+(instancetype) new __attribute__((unavailable("new not available, call sharedInstance instead")));
@end
@implementation MySingleton
+(instancetype) sharedInstance {
static dispatch_once_t pred;
static id shared = nil;
dispatch_once(&pred, ^{
shared = [[super alloc] initUniqueInstance];
});
return shared;
}
-(instancetype) initUniqueInstance {
return [super init];
}
@end
+1
Ух! Отлично! Спасибо!
0
Ваш коммент круче всей статьи. Если из нее убрать ненужную воду, которую автор добавил чтобы получить книгу из пальца, получится старое говно времен iOS SDK 3.
0
Объясните пожалуйста, почему сразу нельзя написать: shared = [[super alloc] init];?
+1
Sign up to leave a comment.
Синглтон (Перевод с английского главы «Singleton» из книги «Pro Objective-C Design Patterns for iOS» Carlo Chung)