2011-04-19 3 views

Répondre

0

Une fois que vous avez donné objet autorelease appel, maintenant que vous avez donné la responsabilité de libération à autorelease pool, maintenant il est comme vous ne possédez pas .. Il montrera un comportement aléatoire, il peut se bloquer ou parfois non. (dépend du moment où autorlease piscine libérer, si sa sortie il se bloque)

+0

Ce n'est pas exactement exact. Il restera valide jusqu'à ce que la piscine soit drainée. Il ne commencera pas tout à coup à se briser parce que vous autoreleased. – Chuck

+0

oui, c'est ce que j'ai écrit en dernière ligne. Comme nous ne savons pas ce qui entoure le code donné, nous ne pouvons jamais en être sûrs. (Qu'il soit drainé ou non.) – Ravin

26

Brisons-le:

[Ball alloc]: Cela crée un objet de balle que nous possédons (et donc besoin de libérer).

[[Ball alloc] init]: Ceci initialise l'objet Ball que nous venons de créer.

[[[Ball alloc] init] autorelease]: Ceci ajoute la boule au pool autorelease courant, ainsi elle sera libérée quand ce pool est drainé. C'est la bonne chose à faire si, par exemple, nous allions renvoyer la balle d'une méthode.

[[[[Ball alloc] init] autorelease] autorelease]: Ceci libère à nouveau l'objet Ball. C'est 100% faux. alloc est la seule revendication de propriété dont nous avons besoin pour équilibrer, donc la balle sera maintenant libérée trop de fois. Cela pourrait se manifester de plusieurs façons, mais il va probablement se bloquer.

+0

J'essaie cela [[[[Ball alloc] init] autorelease] autorelease]; et il ne va pas tomber en panne. pourriez-vous s'il vous plaît laissez-moi savoir quand il va planter? –

+0

@SachinKumaram: C'est un comportement indéfini. Il n'y a aucune garantie. En général, il a tendance à être plus susceptible de planter lorsque plus d'objets sont alloués. – Chuck

1

Réponse courte: Une panne s'ensuit.

Questions connexes