2015-01-28 2 views
-1

Когда я инициализирую синглтон, как это, я обнаружил, что это приведет к мертвой блокировке.Dead lock on Singleton call

@interface A : NSObject 
@property (readwrite, nonatomic, assign) BOOL flag; 
@end 

@implementation A 

+(instancetype)sharedInstance 
{ 
    static id instance = nil; 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     instance = self.new; 
    }); 
    return instance; 
} 

-(instancetype)init 
{ 
    self = [super init]; 
    if(self != nil) 
    { 
     [A sharedInstance].flag = YES; 
    } 
    return self; 
} 
@end 

Есть ли способ его разорвать?

+0

Просто предположите, но не вызывайте 'sharedInstance' из' init', который вызывает 'sharedInstance'. –

+1

Обратите внимание, что использование «точечного синтаксиса» должно быть ограничено свойствами и/или настройкой/получением, а не вызовом методов с побочными эффектами. – zaph

ответ

2

Проблема эта линия:

[A sharedInstance].flag = YES; 

Изменить его к этому:

self.flag = YES; // or _flag = YES; 

Как у вас есть, то init пытается получить доступ к синглтону в то время как синглтон все еще создаются.