2014-08-27 1 views
0

Я создал одноэлементный класс, используя этот код:Создание синглтона и переопределение метода класса Alloc

static MyClass *sharedMyClass = nil; 

+ (id)getInstance { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    sharedMyClass = [[self alloc] init]; 
    }); 
    return sharedMyClass; 
} 

моего беспокойство о том, что пользователи моего класса могут вызвать метод Alloc, может создать другую инстанциацию из класс. Поэтому это больше не будет односторонним. Должен ли я переопределить метод alloc? Если это так, я предлагаю переопределить это следующим образом:

+ (id)alloc 
{ 
    id instance = sharedMyClass; 
    if (instance == nil) { 
    instance = [super alloc]; 
    } 
    return instance; 
} 
+0

+ (ID) Alloc {@synchronized ([MyCLASS класс]) { NSAssert (_sharedNavTheme == ноль, @ "Попытка выделить второй экземпляр одноточечного."); _sharedMyClass = [super alloc]; return _sharedMyClass; } return nil; } –

ответ

1

Реализуйте это так?

+(id)alloc 
{ @synchronized([MyClass class]) 
    { 
     NSAssert(_sharedMyClass == nil, @"Attempted to allocate a second instance of a singleton."); 
     _sharedMyClass = [super alloc]; 
     return _sharedMyClass; 
    } 
    return nil; 
} 
+0

Что вы подразумеваете под _sharedNavTheme? – user3928968

+0

Почему это под директивой @synvhronized? Есть ли что-то, что делает его потоком небезопасным? – user3928968

+0

_sharedNavTheme был мой синглтон, я забыл его отредактировать, я исправил его сейчас :) и @synchronized сделать его потокобезопасным небезопасным. Это гарантирует, что не более одного потока может использовать связанный с ним код :) –

0

Да, вам необходимо перезаписать меток alloc.

Вы можете архивировать это путем реализации

+ (instancetype)sharedInstance { 
    static MyClass *sharedInstance = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[super allocWithZone:NULL] init]; 
    }); 

    return sharedInstance; 
} 

+ (id)allocWithZone:(NSZone *)zone { 
    return [self sharedInstance]; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 

Apple, содержит подробное описание этого случая, который вы можете найти здесь (не описание ARC) https://developer.apple.com/legacy/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

0

Вы можете запретить alloc во время компиляции:

+ (instancetype)new NS_UNAVAILABLE; 
+ (instancetype)alloc NS_UNAVAILABLE; 

Использование super alloc в вашей собственной реализации:

+ (instancetype)getInstance { 
    static id sharedMyClass 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    sharedMyClass = [[super alloc] init]; 
    }); 
    return sharedMyClass; 
} 

Это не защищает вас от кода во время выполнения, но это достаточно ясно.