2010-11-06 6 views
0

J'avais compris qu'une fois que vous avez libéré un objet, vous ne devriez pas l'utiliser car cela entraînerait une erreur puisqu'il n'est plus en mémoire.Libérer un objet mais pouvoir l'utiliser

Mais en lisant this Apple guide, j'ai trouvé ce code, et l'ai déjà vu auparavant, mais je voudrais juste déplacer le [object release] à la fin de mon code, afin d'éviter d'obtenir une erreur. Mais il semble que cela soit accepté et fonctionne. Alors, pourquoi ça marche? Comment peut-il garder les variables à dateAttribute après sa sortie?

(ligne 3 est celui en question):

NSMutableArray *runProperties = [NSMutableArray array]; 

NSAttributeDescription *dateAttribute = [[NSAttributeDescription alloc] init]; 
[runProperties addObject:dateAttribute]; 
[dateAttribute release]; 
[dateAttribute setName:@"date"]; 
[dateAttribute setAttributeType:NSDateAttributeType]; 
[dateAttribute setOptional:NO]; 

Il a obtenu d'ici: Creating a managed object model in code

Répondre

2

Il y a peu de points dont nous devrions discuter.

  1. release ne fait pas font toujours l'objet désalloué. L'objet ne sera désalloué qu'à la "dernière" version, c'est-à-dire lorsque le nombre de rétention tombera à zéro.
  2. En dépit de cela, il est toujours vrai que vous ne devriez pas utiliser l'objet après l'avoir libéré, car il est possible qu'il soit déjà désaffecté .
  3. Le NSMutableArray conservera l'objet jusqu'à ce qu'il soit supprimé de la baie ou que la baie elle-même soit allouée.

L'exemple prendre l'avantage que le tableau sera retain la référence lorsqu'il est ajouté, de sorte que la référence ne sera pas encore désattribuées après avoir relâché dateAttribute. Cependant, ce n'est pas un bon style car sa validité dépend uniquement de la nature de la classe NSMutableArray elle-même, et elle enfreint la règle commune selon laquelle nous ne devrions pas utiliser la référence publiée.

+0

Modifié pour supprimer la référence à 'retainCount'. Le concept de drop to 0 est valide, mais 'retainCount' ne peut jamais retourner 0 pour des raisons évidentes. – bbum

+0

Le compilateur change-t-il 'dateAttribute' en adresse mémoire? Parce que pour moi, même si le tableau crée un autre 'retain' sur l'objet, c'est toujours deux pointeurs différents (un appelé dateAttribute, un autre appelé runProperties [0]). Donc, si je libère 'dateAttribute', je pense que je libère le pointeur vers cet objet, et la seule façon d'utiliser l'objet serait' [[runProperties objectAtIndex: 0] setSomething: blah]; ' – elcool

+0

Non, la dateAttribute pointera vers la même adresse après la libération, et peu importe que la libération entraîne une désallocation ou non. – tia

1

Techniquement, cela est mauvais style, mais il fonctionne. NSMutableArray (l'exécutable addProperties) appelle retain sur l'attribut dateAttribute. Par conséquent, appeler la version ne détruit pas l'attribut dateAttribute (il existe toujours une référence). Pour des raisons de lisibilité et de refactoring, je placerais également l'appel au releasedernier.

Questions connexes