Objective-C de Différence entre l'établissement de néant et de libérer
J'ai appris que dans la dealloc
vous ne [object release];
mais dans viewDidUnload
(dans une sous-classe UIViewController) vous ne self.object = nil
. Ce qui est vraiment la différence, parce que self.object = nil
(nous sommes en supposant que l'objet est un (nonatomic, retain)
propriété) conserve nil
(qui ne fait rien) et puis libère la vieille valeur et puis le compteur de référence est de 0 à droite?
Vous devez vous connecter pour publier un commentaire.
self.object = nil
appels de votre setter, qui permettra de libérer l'ancienne valeur, définir le membre denil
, et éventuellement faire d'autres choses (c'est une méthode, de sorte qu'il pourrait faire n'importe quoi). Le "rien" partie de qui est potentiellement dangereux; voir cette question, par exemple.[object release]
communiqués de l'ancienne valeur, mais laisse le membre comme un aujourd'hui-se balançant pointeur, ce qui est une bonne recette pour les bugs. Dansdealloc
il n'a pas vraiment d'importance, puisque le pointeur lui-même est sur le point d'aller trop loin, mais dans tous les autres cas, c'est une très mauvaise idée de sortir un membre sans réglage ànil
.(Au passage, vous ne devez jamais supposer que la libération d'un objet donne un nombre de références de 0. Il libère votre référence, mais d'autres objets peuvent encore avoir des références.)
[myivar release]
est en fait pas à l'aide de l'incubateur. C'est à l'aide de la variable d'instance qui sauvegardeself.myivar
. Donc[myivar release]
etmyivar = nil
sont parfaitement bien dans le dealloc. Cependantself.myivar = nil
ne l'est pas.Si vous ne
object = nil
sans[object release]
, qui peut causes de la mémoire qui fuit. Si vous ne[object release]
sansobject = nil
par la suite, l'objet devient bancale pointeur comme @Jim suggéré.self.object = nil
est un sucre pour setter appel de fonction.Si vous n' [objet release], et que vous voulez accéder à l'objet de l'application tout simplement crash.
Si vous ne object = néant, et que vous voulez accéder à l'objet, rien ne sera effectuer.
La raison en est dans la [objet release], vous êtes tenté de libérer l'objet. de sorte que son nont pas le pointeur (pas de memoty).Dans le
object = nil,
vous êtes tenté d'attribuer à l'objet avec pointeur null. donc, si u essayant d'accéder à l'objet ne se passera rien.Généralement, nous avons écrit le code [
object release]; object = nil;
parce que si u accéder à l'objet de façon inattendue, l'application de la coutume s'est écrasé.Si vous venez de libérer un objet, alors, il sera libéré de l'objet.
Et si vous essayez d'effectuer une opération sur un objet libéré alors votre application se bloque. Pour éviter de tels accidents, il est toujours préféré "affecter votre objet à néant après l'avoir relâché". Parce que nous savons tous toutes les opérations effectuées sur le nil ne sera pas exécuté 🙂