Quelle est la différence entre libérer et autoreleasing?
J'ai encore un peu floues comprendre au sujet de la libération et de l'autorelease. Quelles sont les différence entre les deux? J'ai ce code. Pour facebook connexion. Je crash parfois, quand je vais sur Facebook login, je doutant peut-être que c'est parce que je ne relâchez pas l'objet de bien.? Merci pour toute aide
if (_session.isConnected) {
[_session logout];
} else {
FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
[dialog show];
}
source d'informationauteur Rocker
Vous devez vous connecter pour publier un commentaire.
La Gestion de la mémoire Guide de Programmation pour le Cacao sera bientôt votre meilleur ami. En bref, les instances d'objet dans le Cacao sont de mémoire gérés à l'aide de comptage de référence (à moins, bien sûr, vous êtes à l'aide de la collecte des ordures sur OS X). Un objet indique qu'il veut "conserver" un intérêt de propriété dans une autre instance--garder d'être libéré--par l'envoi d'un
-retain
message. Un objet indique qu'il veut libérer que d'intérêt en envoyant l'autre cas, un-release
message. Si le nombre d'objets qui ont "retenu" et participation à la propriété d'un objet tombe à 0 (c'est à dire lorsque le dernier de la possession d'instances envoie un-release
message), l'instance avec un 0 à conserver le comte est libéré.Il est parfois commode de dire "je veux que cette instance d'être libéré un certain temps dans l'avenir". C'est le but de
-autorelease
. L'envoi d'un-autorelease
message ajoute le récepteur à l'actuelNSAutoreleasePool
. Lorsque le bassin est vidé, il envoie un-release
message à toutes les instances de la piscine. UnNSAutoreleasePool
est créé automatiquement au début de chaque itération de la course du fil de la boucle et vidé à la fin de l'itération. Ainsi, vous pouvez faire quelque chose comme cela dans une méthode:À l'appelant de cette méthode permettra d'obtenir en retour une instance qu'ils peuvent
-retain
s'ils veulent le garder. Si ils n'ont pas le conserver, il va rester au moins jusqu'à l'affichage de autorelease pool est drainée:Libérant les moyens de vous libérer tout de suite.
Autoreleasing signifie que vous souhaitez que la variable à être mis sur le côté autorelease pool.
Vous utilisez autorelease lorsque vous souhaitez garder en conservant la variable, mais ne voulez pas créer une fuite de mémoire. Vous utilisez relâchez-la lorsque vous n'avez pas besoin de la variable de plus.
Exemple:
Pourquoi utilisons-nous autorelease?
Si nous utilisons [résultat de presse] au lieu de cela, la variable de résultat sera détruit À cette époque. Ce qui signifie que la valeur retournée sera ordures.
Si nous ne communiquons pas à tous, variable
result
sera TOUJOURS affiché encourir de fuite de mémoire.Nous pouvons dire à chaque appelant à la fonction de libération de suite, mais ce serait un mal de tête et sujette à l'erreur.
Nous utilisons donc des autorelease. Nous marquons la variable à être mis sur le côté autorelease pool. Fondamentalement, nous marque de la variable à être libéré près de l'alloc. D'où le mantra alloc est jumelé avec la libération, dans la même fonction est titulaire de tous les temps.
En fait, vous ferez bien de changer tous les rejets dans autorelease. Votre utilisation de la mémoire ne sera pas efficace, cependant, l'effet est minime. Toutes les variables, dans tout langage de programmation est effectivement autoreleased.
De toute façon, l'utilisation de l'ARC.
débat de fond:
objective-c est un décompte de références, de sorte que les objets sont supprimés lorsque le compteur de référence atteint 0. libération réduit la référence-comte immédiatement, autorelease réduit lorsque l'autorelease pool est sorti
quand utiliser:
utilisation autorelease lors de l'attribution de l'objet, si
utiliser "manuel" libération
mais vraiment mon freand:
Erik
Selon la Gestion de la mémoire Guide de Programmation pour le Cacao:
Aussi: