2010-08-30 6 views
0

J'ai un objet NSDate que je l'utilise dans le fil conducteur de mon application iPhone et je référence aussi à partir d'un fil d'arrière-plan, son défini comme ceci:ne peux pas comprendre pourquoi mon objet se deallocated

//header 
NSDate *currentDate; 
@property (nonatomic, retain) NSDate *currentDate; 

//implementation file 
@synthesize currentDate; 

puis dans mon application, je l'appelle une méthode RefreshData qui passe cet objet à une autre classe d'aide pour obtenir des données d'un service à distance:

- (void) reloadData: (NSInvocationOperation*)operation 
{ 
    //... 
    NSMutableArray *results = [managerHelper refreshForAddress: address 
                 timeFrom: fromDate 
                 timeTo: self.currentDate]; 
    //... 
} 

(notez l'appel ci-dessus est sur le fil de fond)

maintenant, à côté de cette classe d'aide, j'ai ajouté ces lignes

- (NSMutableArray*) refreshForAddress:(NSString *)address 
          timeFrom:(NSDate*) fromDate 
           timeTo:(NSDate*) toDate 
{ 
    debugLog(@"retain count: %i", [toDate retainCount]); 
    NSNumber *toTimeNumber = [[NSNumber alloc] initWithDouble: [toDate timeIntervalSince1970]*1000]; 
    debugLog(@"after retain count log"); 
} 

Mais je reçois l'erreur classique: "*** - [__ NSDate timeIntervalSince1970]: message envoyé à l'instance désallouées 0x71beea0"

Et l'exploitation forestière dit:

MyApp [5487: 7903] conserver le nombre: 2 MyApp [5487: 7903] *** - [__ NSDate timeIntervalSince1970]: message envoyé à l'instance désallouées 0x71beea0

donc, comme vous pouvez le voir le dernier état de log nt ne se fait pas appeler, mais le retainCount est 2, comment cela peut-il être quand je reçois cette erreur la ligne après l'appel de journal?

+1

pouvez-vous nous montrer comment vous initialisez le 'currentDate' varaible? –

+0

comme ceci: self.currentDate = [date NSDate]; – Mark

+1

Ignorer 'retainCount'. Il ne devrait jamais être invoqué, et existe seulement en 2010 pour des raisons héritées. –

Répondre

1

Vous avez dit que vous utilisiez deux threads ou plus. Donc, vous devez définir la propriété comme manière suivante,

@property (retain) NSDate *currentDate; ///< atomic default 

De cette façon garantira thread-safe pour cette propriété.

Edit:

Retirez le "nonatomic" de @property, et il se comporte comme une opération atomique par défaut. L'opération atomique garantira un comportement sécurisé.

+0

Voulez-vous dire "conserver"? ou reatin? – Mark

+0

aussi, cela expliquerait-il le problème im obtenir? – Mark

+0

Désolé, je tape mal. Je veux dire "retenir", et non "nonatomique". Je pense que vous avez le fil principal et le fil d'arrière-plan. Donc, si deux threads vont utiliser cette propriété, je pense qu'il est important de garantir la sécurité des threads. – AechoLiu

1

La façon dont vous initialisez le NSDate renvoie une instance de libération automatique qui sera automatiquement distribuée à la fin de la boucle d'événements. Utilisez [[NSDate date] retain] et n'oubliez pas de le libérer manuellement.

+1

'self.currentDate = ...' conserve l'objet – tobiasbayer

Questions connexes