EXC_BAD_ACCESS类别访问静态成员

问题描述:

我已经使用这个NSDate Extension了一段时间,但现在它只是开始,同时呼吁崩溃[NSDate的currentCalendar]从multimple线程dateAtStartOfDay方法和一些TIEM我收到了崩溃与EXC_BAD_ACCESS和存储地址。EXC_BAD_ACCESS类别访问静态成员

问题是,当我在同一时间从多个线程访问该static NSCalendar *sharedCalendar时,我得到该错误。

共享访问:

+ (NSCalendar *) currentCalendar 
{ 
    static NSCalendar *sharedCalendar = nil; 
    if (!sharedCalendar) 
     sharedCalendar = [NSCalendar autoupdatingCurrentCalendar]; 
    return sharedCalendar; 
} 

我怎样才能解决这个问题?

这里是错误:

enter image description here 和打印对象时:(有时[的NSDate currentCalendar]返回地址)

enter image description here

+0

'NSCalendar'不是线程安全的。您将不得不添加代码以确保没有对共享日历的并发访问。 – rmaddy

+0

@rmaddy这就是为什么该方法将日历存储到静态变量中,请参阅更新后的问题。 –

+0

这并不改变你在多线程上同时在这个共享的静态'NSCalendar'实例上调用方法的事实。 'NSCalendar'不支持。 – rmaddy

行,就是现在所施加的溶液是:

+ (NSCalendar *)currentCalendar 
{ 
    dispatch_once(&onceToken, ^{ 
     sharedCalendar = [NSCalendar autoupdatingCurrentCalendar]; 
    }); 

    return sharedCalendar; 
} 

我刚刚包装了的初始化3210在dispatch_once。近半年没有问题。