114 votes

Explication de forte et faible stockage dans iOS5

Je suis nouveau à l'objective-c, et de commencer avec iOS5 (n'ayant aucune connaissance préalable de l'iOS4). J'ai de la difficulté à comprendre la différence entre le fort et le faible, le stockage, la lecture de la documentation, et d'autres questions, mais encore ils son identique à moi.

J'ai lu la documentation: la Transition À l'ARC - il des références à iOS4 termes de conserver, céder, et la sortie, ce qui me confond. Ensuite, je regarde dans l'Ouvert U CS193p où elle se différencie fort et faible:

Forte: "garder cette dans le tas jusqu'à ce que je n'ai pas de point de plus".
Faible: "garder cette aussi longtemps que quelqu'un d'autre points à elle fortement"

Ne sont pas les deux définition identique = si le pointeur n'est plus pointant vers un objet, puis libérer la mémoire contenant l'objet? Je comprends la notion de pointeurs, d'un segment, d'allocation et de désallocation de la mémoire - mais quelle est la différence entre les forts et les faibles?

509voto

BJ Homer Points 29168

La différence est qu'un objet va être libéré dès qu'il n'y a pas une forte pointeurs. Même si la faiblesse de l'pointeurs pointent vers celle-ci, une fois la dernière forte pointeur est parti, l'objet sera libéré, et tous les autres des pointeurs faibles seront remis à zéro.

Peut-être un exemple en est, dans l'ordre.

Imaginez notre objet est un chien et que le chien a envie de fuir (être libéré).

De fortes présomptions sont comme une laisse sur le chien. Tant que vous avez la laisse attachée au chien, le chien ne s'en ira pas. Si cinq personnes de joindre leur laisse d'un chien, (cinq de fortes présomptions pour qu'un seul objet), puis le chien ne s'en ira pas jusqu'à ce que tous les cinq laisses sont détachés.

Des pointeurs faibles, d'autre part, sont comme de petits enfants, pointant vers le chien et dire "Regardez! Un chien!" Tant que le chien est encore sur la laisse, les petits enfants peuvent encore voir le chien, et ils vont encore point. Dès que tous les laisses sont détachés, cependant, le chien s'enfuit de la maison, peu importe combien de petits enfants qui sont pointant vers elle.

Dès que le dernier fort pointeur (laisse) ne pointe plus vers un objet, l'objet sera libéré, et tous des pointeurs faibles seront remis à zéro.

34voto

mattjgalloway Points 24217

Ne sont pas les deux définition identique.

Absolument pas. La clé de la différence entre les deux définitions que vous avez souligné, c'est le "tant que quelqu'un d'autre". C'est le "quelqu'un" qui est important.

Considérez les points suivants:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;

Maintenant nous avons un deux pointeurs vers <some_object>, un fort et un faible. Si nous fixons strongObject de nil comme:

strongObject = nil;

Alors si vous passez par les règles décrites alors que vous posez-vous ces questions:

  1. Forte: "garder cette dans le tas jusqu'à ce que je n'ai pas de point de plus".

    strongObject n'a pas de point d' <some_object> plus. Donc, nous n'avons pas besoin de le garder.

  2. Faible: "garder cette aussi longtemps que quelqu'un d'autre points à elle fortement"

    weakObject encore des points de <some_object>. Mais puisque personne d'autre points, cette règle signifie également que nous n'avons pas besoin de le garder.

Le résultat est qu' <some_object> est libérée, et si votre runtime prend en charge (Lion et iOS 5 vers le haut) alors weakObject sera automatiquement mis nil.

Maintenant, considérons ce qui se passe si nous avons fixé weakObject de nil comme:

weakObject = nil;

Alors si vous passez par les règles décrites alors que vous posez-vous ces questions:

  1. Forte: "garder cette dans le tas jusqu'à ce que je n'ai pas de point de plus".

    strongObject n'a point d' <some_object>. Nous avons donc besoin de le garder.

  2. Faible: "garder cette aussi longtemps que quelqu'un d'autre points à elle fortement"

    weakObject n'a pas de point d' <some_object>.

Le résultat est qu' <some_object> est pas libéré, mais weakObject sera nil pointeur.

[Notez que tout ce qui est en supposant <some_object> n'est pas indiqué par un solide de référence quelque part d'autre / d'autres moyens d'être "tenu"]

2voto

Shashi3456643 Points 21

Fort

  1. Crée la propriété entre la propriété et la valeur attribuée à l'.
  2. C'est la valeur par défaut pour la propriété de l'objet dans l'ARC de sorte qu'il ne les laissez pas vous soucier de compte de référence et de libérer la référence automatiquement.
  3. Il est le remplacement pour les conserver. Nous utilisons, si et seulement si nous avons besoin d'utiliser retenir.

Faible

  1. Crée la non-propriété entre la propriété et la valeur attribuée à l'.
  2. Forte est utilisé sur l'objet parent et faible est utilisé sur l'objet enfant lorsque le parent est relâché, l'enfant de l'objet de référence est également mis à néant
  3. Il aide à prévenir l'conserver cycles.
  4. Elle ne protège pas l'objet référencé lors de la collecte par le garbage collector.
  5. Faible est essentiellement affecté, unretain de la propriété.

1voto

Gabriel Points 2189

Non, ils ne sont pas identiques, mais très différents. Vous utilisez forte uniquement si vous devez conserver l’objet. Vous utilisez faible sur tous les autres cas, avec l’avantage de qui vous pouvez savoir si objet ha supprimée des tas parce que personne n’est son maintien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X