Еще один EXC_BAD_ACCESS - Однако с зомби (инструменты), никогда не exe_bad_access - PullRequest
0 голосов
/ 20 июля 2011

Я потратил часы на это и читал каждый бит в Интернете об управлении памятью, зомби. утечки (проверенные инструменты). Но я не могу понять это. У кого-то есть подсказка? Я получаю EXC_BAD_ACCESS в следующем, похожем на код при извлечении ChildViewController.

[profileVO release]; profileVO = nil;

Я чувствую, что следую всем рекомендациям по управлению памятью!

подробности:

У меня есть файл модели. (CachedProfileVO)

CachedProfileVO.h

@interface CachedProfileVO : NSObject {

   NSString *name;
   NSString *email;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *email;

@end

CachedProfileVO.m

@synthesize name, email;
- (void) dealloc
{
    [super dealloc];
    [name release]; name= nil;
    [email release]; email = nil; 
}

Теперь у меня есть UINavigationController. ParentViewController и ChildViewController. Я вызываю ChildViewController следующим образом:

[self.navigationCntroller pushViewcontroller:childViewcontroller animated:YES];

В ChildViewController я в основном использую модель CachedProfileVO. Однако, когда этот контроллер представления отключен (кнопка возврата на пользовательском интерфейсе), он дает EXC_BAD_ACCESS

ChildViewController.h

@interface ChildViewcontroller : UITableViewController {
    CachedProfileVO *profileVO;  

}

@property (nonatomic, retain) CachedProfileVO *profileVO;
@end

ChildViewController.m

@synthesize profileVO;

- (void) dealloc
{
   [super dealloc];
   [profileVO release]; profileVO = nil; ****** GETTING EXE_BAD_ACCESS here
}

- (void) viewDidLoad
{
 CachedProfileVO *vo = [CachedProfileVO alloc] init];
 self.profileVO = vo;
 [vo release];

}

//responseString looks like this: [Murdoch, murdoch@email.com][other data][more data]
- (void) populateProfile:(NSString *) responseString 
{
  NSMutableString *str = [[NSMutableString alloc] initWithCapacity:20];
  [str setString:responseString];
  [str deleteCharactersInRange: NSMakeRange(0,1)];
  [str deleteCharactersInRange: NSMakeRange([str length]-1,1)];
  NSArray *tempArray = [str componentsSeparatedByString: @"]["];

  NSString *tempStr = (NSString*)[tempArray objectAtIndex:0];
  NSArray *bioArray = [tempStr componentsSeparatedByString:@","];

  self.profileVO.name = (NSString*)[bioArray objectAtIndex:0];
  self.profileVO.email= (NSString*)[bioArray objectAtIndex:1];

  [str release]; str = nil;
}

Обратите внимание, что функция populateProfile вызывается после некоторого события. Я знаю, что это называется. И Deloloc тогда вызывает проблему. Также это не случается в каждой популярности. Я должен попытаться воспроизвести несколько раз. Он никогда не воспроизводится с использованием зомби в инструментах !!!

1 Ответ

1 голос
/ 20 июля 2011

Вы звоните [super dealloc]; первым в ваших примерах. Это всегда должен быть последний вызов, в противном случае вы обращаетесь к переменным экземпляра, которые принадлежат освобожденному классу. Следующее должно работать нормально, если вы следовали правилам управления памятью в других местах.

- (void) dealloc
{
   [profileVO release];

   [super dealloc];
}
...