还有另一个EXC_BAD_ACCESS - 但是僵尸(乐器),绝不是exc_bad_access

时间:2011-07-20 01:36:09

标签: objective-c xcode memory-management nsstring exc-bad-access

我花了好几个小时在网上阅读有关内存管理,僵尸的网站上的所有内容。泄漏(试过的仪器)。但我无法想出这个。有人有线索吗?我在弹出ChildViewController的代码中得到了一个EXC_BAD_ACCESS。

[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。但是,当弹出此视图控制器(UI上的后退按钮)时,它会提供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函数。我知道它被称为。然后dealloc导致问题。每次流行音乐都不会发生这种情况。我必须尝试几次才能重现。它永远不会使用乐器中的僵尸来复制!!!

1 个答案:

答案 0 :(得分:1)

您在示例中首先调用[super dealloc];。这应该始终是最后一次调用,否则您将访问属于现在释放的类的实例变量。如果您在其他地方遵循内存管理规则,以下内容应该可以正常工作。

- (void) dealloc
{
   [profileVO release];

   [super dealloc];
}