2010-10-10 2 views
0

Проблема возникает, когда я пытался выпустить одну из моих переменных экземпляра и переназначить это новое значение.Проблема dealloc с переменными экземпляра

Я хотел бы высказать адрес, на который указывает переменная экземпляра, и повторно назначить ему новое значение.

код выглядеть следующим образом: заголовочных

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

.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; 
} 

Однако, с [addAnnotation release], EXC_BAD_ACCESS всегда приходит вместе, если процесс проходит через него.

Таким образом, я распечатал адреса памяти в dealloc из AddressAnnotationManager:

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

Я включил зомби, консоль дал мне что-то вроде этого:

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

2010-10-10 17: 02: 54,396 [1908: 207] - [Ad dressAnnotationManager release]: сообщение отправлено на освобожденный экземпляр 0x46c7360 *

Это значит, что код достигает dealloc, прежде чем проблема возникнет.

Я проверил все возможные места, где я мог бы выпустить addAnnotation. Однако я не мог найти.

Неужели кто-нибудь случайно выяснил, в чем проблема?

ответ

2

Я подозреваю, что это не весь код с переменной addAnnotation. Скорее всего, [mapView removeAnnotation:addAnnotation];, который выпускает addAnnotation, уже делает отсчет количества ссылок равным нулю. У вас есть что-то подобное в вашем коде где-нибудь?

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

Если да, то вы переданы в полную собственность addAnnotation к MAPview и вам не нужно, чтобы выпустить его в showAddress больше, что означает, что removeAnnotation: достаточно.

Смежные вопросы