2016-11-16 11 views
1

je l'avais en utilisant ce NSDate Extension pendant un certain temps, mais maintenant il commence juste écraser tout en appelant [NSDate currentCalendar] la méthode dateAtStartOfDay de fils multimple et certains tiem je reçois un accident avec EXC_BAD_ACCESS et une mémoire adresse.EXC_BAD_ACCESS accès à un membre statique dans la catégorie

Le problème est que lorsque j'accède static NSCalendar *sharedCalendar de plusieurs threads en même temps je reçois cette erreur.

accès partagé:

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

Comment puis-je résoudre ce problème?

ici est l'erreur:

enter image description here et lors de l'impression des objets: (parfois le [NSDate currentCalendar] renvoient l'adresse)

enter image description here

+0

'NSCalendar' n'est pas sûr pour les threads. Vous allez devoir ajouter du code pour vous assurer qu'il n'y a pas d'accès simultané au calendrier partagé. – rmaddy

+0

@rmaddy C'est pourquoi la méthode stocke le calendrier dans une variable statique, veuillez consulter la question mise à jour. –

+0

Cela ne change rien au fait que vous appelez des méthodes sur cette instance statique partagée 'NSCalendar' simultanément sur plusieurs threads. 'NSCalendar' ne supporte pas cela. – rmaddy

Répondre

1

Ok, la solution qui est appliquée en ce moment est:

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

    return sharedCalendar; 
} 

je viens d'envelopper l'initialisation du sharedCalendar dans un dispatch_once. Presque la moitié d'année aucun problème.