2010-10-10 4 views
0

Un problème est survenu lorsque j'essayais de libérer une de mes variables d'instance et de réaffecter une nouvelle valeur.problème dealloc avec les variables d'instance

J'aimerais libérer l'adresse vers laquelle pointe une variable d'instance et lui attribuer à nouveau une nouvelle valeur.

Le regard de code comme ceci: Le .h

@interface MapPageController : UIViewController<MKMapViewDelegate> { 
AddressAnnotationManager *addAnnotation; 
} 
- (IBAction) showAddress; 
@property (nonatomic, retain) AddressAnnotationManager *addAnnotation; 

Le .m

@synthesize addAnnotation; 
- (IBAction) showAddress { 
     if(addAnnotation != nil) { 
    [mapView removeAnnotation:addAnnotation]; 
    [addAnnotation release]; // this generates the problem 
    addAnnotation = nil; 
} 
addAnnotation = [[AddressAnnotationManager alloc] initWithCoordinate:location]; 
addAnnotation.pinType = userAddressInput; 
addAnnotation.mSubTitle = addressField.text; 
} 

Cependant, avec [addAnnotation release], un EXC_BAD_ACCESS est toujours le long si le processus traverse.

Ainsi j'ai imprimé l'adresse mémoire dans le dealloc de AddressAnnotationManager:

- (void)dealloc { 
NSLog(@"delloc Instance: %p", self); 
[super dealloc]; 
} 

Je me suis tourné sur Zombie, la console m'a donné quelque chose comme ceci:

2010-10-10 17:02 : 35,648 [1908: 207] delloc instance: 0x46c7360

2010-10-10 17: 02: 54,396 [1908: 207] - [annonce dressAnnotationManager release]: message envoyé à l'instance désaffectée 0x46c7360 *

Cela signifie que le code atteint dealloc avant que le problème se produise.

J'ai vérifié tous les endroits possibles où je pourrais publier addAnnotation. Cependant, je n'en ai pas trouvé.

Est-ce que quelqu'un trouve quel est le problème?

Répondre

2

Je soupçonne que ce n'est pas le code entier impliquant la variable addAnnotation. Très probablement [mapView removeAnnotation:addAnnotation];, qui publie addAnnotation, fait déjà tomber le compte de référence à zéro. Avez-vous quelque chose comme ça dans votre code quelque part?

[mapView addAnnotation:addAnnotation]; 
[addAnnotation release]; 

Si oui, alors vous avez transféré la propriété complète de AddAnnotation à la Mapview et vous n'êtes pas obligé de le libérer dans showAddress plus, ce qui signifie que removeAnnotation: est suffisant.

Questions connexes