我花了好几个小时在网上阅读有关内存管理,僵尸的网站上的所有内容。泄漏(试过的仪器)。但我无法想出这个。有人有线索吗?我在弹出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导致问题。每次流行音乐都不会发生这种情况。我必须尝试几次才能重现。它永远不会使用乐器中的僵尸来复制!!!
答案 0 :(得分:1)
您在示例中首先调用[super dealloc];
。这应该始终是最后一次调用,否则您将访问属于现在释放的类的实例变量。如果您在其他地方遵循内存管理规则,以下内容应该可以正常工作。
- (void) dealloc
{
[profileVO release];
[super dealloc];
}