2010-07-16 6 views
0

J'essaie désespérément de changer les images sur une instance OpenFlow sans succès. Je suis en quelque sorte abandonner alors j'essaye maintenant de supprimer l'instance et d'en créer une nouvelle. Mais je ne peux pas éviter de planter l'application.OpenFlow plante l'application en essayant de réinitialiser/recréer

Le code pour créer est:

AFOpenFlowView *of = [[AFOpenFlowView alloc] initWithFrame:CGRectMake(0, 100, 320, 380)]; 
[of setCenter:CGPointMake(160, 240)]; 
[of setBackgroundColor:[UIColor blackColor]]; 
[of setDataSource:self]; 
[of setViewDelegate:self]; 

[self setPeopleFlow:of];  
[self.view addSubview:peopleFlow]; 

[of release]; 

Ensuite, un clic sur un bouton que je fais:

[peopleFlow removeFromSuperview]; 
[peopleFlow release]; 

Plus tard j'appelle la même fonction avec le premier bloc de code à créez-le à nouveau et c'est quand l'application se bloque sans erreur de journal.

Des idées sur la façon de nettoyer l'objet OpenFlow pour le repeupler sans avoir à supprimer/recréer? Ou comment créer/recréer de manière fiable?

+0

Est-ce que [release de peopleFlow] est vraiment nécessaire? Est-ce que vous l'avez retenu quelque part en dehors de la vue à laquelle il est ajouté? – willcodejavaforfood

Répondre

0

Lorsque vous créez l'instance peopleFlow, il a un nombre de retenir 1.

Ensuite, lorsque vous ajoutez un sous-vue, la vue super retient, il est donc conserver le nombre est 2.

Ensuite, vous le relâchez après l'avoir ajouté à la vue d'ensemble, donc c'est le nombre de retenue qui est de 1 à nouveau.

Ensuite, vous le supprimez de la vue d'ensemble, et la vue d'ensemble la libère, de sorte que le compte de retenue est 0 et l'objet est désalloué.

Ensuite, vous essayez de le relâcher à nouveau et il se bloque car vous envoyez release à un objet désalloué. En bref, dans ce cas, vous n'avez pas besoin de le relâcher après l'avoir retiré de la vue d'ensemble.

De même, il est recommandé d'attribuer une valeur nulle à un pointeur si vous le relâchez et que vous ne vous souciez plus de ce qui pointe vers le haut. En effet, après avoir libéré et libéré un objet, la variable pointer pointe toujours vers la mémoire que l'objet occupait. L'affectation de zéro au pointeur évite que de mauvaises choses se produisent si vous essayez d'envoyer un message à tout ce que pointe le pointeur.

+0

Merci beaucoup. Je ne comprenais pas très bien comment fonctionnait le comptage des retenues. Mais je sens que j'ai une meilleure compréhension maintenant. brillante réponse. – jordi