在视图之间来回切换时,EXC_BAD_ACCESS会崩溃

在视图之间来回切换时,出现EXC_BAD_ACCESS崩溃。 我有一个问题,find这个崩溃的原因。 在模拟器中,它总是返回到main.m文件并报告崩溃。

但是在我的设备上,当我在dealloc方法中释放EXC_BAD_ACCESS时,在我的自定义UITableViewCell上显示。 如果我启用NSZombieEnabled我的应用程序不会崩溃。

这是.h文件

#import <UIKit/UIKit.h> #define kWinsAmountTagValue 2 // how many wins you have #define kWinningsAmountTagValue 3 // how much money you won @interface MyStatsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UINavigationBarDelegate, UINavigationControllerDelegate>{ NSArray *list; UITableView *theTable; UITableViewCell *theCell; } @property (nonatomic, retain) NSArray *list; @property (nonatomic, retain) IBOutlet UITableView *theTable; @property (nonatomic, retain) IBOutlet UITableViewCell *theCell; // dealloc and cleanup -(void) dealloc; // misc methods -(void)loadData; // demo data -(NSArray *)tableData; @end 

这是我的.m文件

 #import "MyStatsViewController.h" @implementation MyStatsViewController @synthesize list; @synthesize theTable; @synthesize theCell; #pragma mark - dealloc and cleanup - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; NSLog(@"Memory Warning"); // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; self.list = nil; self.theTable = nil; self.theCell = nil; } - (void)dealloc { [super dealloc]; [list release]; [theTable release]; [theCell release]; } #pragma mark - misc methods -(void) loadData { self.list = [self tableData]; } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } -(void)viewWillAppear:(BOOL)animated { [self loadData]; [theTable reloadData]; } #pragma mark - Table Data Source Methods -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [list count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier =@"MyStatsCustomCellIdentifer"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; NSUInteger row = [indexPath row]; if (cell == nil) { if (row == [list count] -1) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } else { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyStatsCustomCell" owner:self options:nil]; if ([nib count] > 0) { cell = self.theCell; } else { NSLog(@"failed to load MyStatsCustomCell"); } } } // Add custom stuff here for rows //cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; if (row == [list count] -1) { cell.textLabel.text = [list objectAtIndex:row]; } else { UILabel *prizeLevel = (UILabel *)[cell viewWithTag:kPrizeLevelTagValue]; prizeLevel.text = [[list objectAtIndex:row] objectForKey:@"prizeLevel"]; UILabel *winsAmount = (UILabel *)[cell viewWithTag:kWinsAmountTagValue]; winsAmount.text = [[list objectAtIndex:row] objectForKey:@"winsAmount"]; UILabel *winningsAmount = (UILabel *)[cell viewWithTag:kWinningsAmountTagValue]; winningsAmount.text = [[list objectAtIndex:row] objectForKey:@"winningsAmount"]; } //NSLog(@"theCell Retain: %i",[theCell retainCount]); return cell; } #pragma mark - Table View Delegate Methods -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; } #pragma mark - demo data -(NSArray *)tableData { NSArray *prizeLevels = [[NSArray alloc] initWithObjects: @"6-of-6", @"5-of-6", @"4-of-6",@"3-of-6", nil]; NSArray *winsAmount = [[NSArray alloc] initWithObjects: @"0", @"0", @"2", @"100", nil]; NSArray *winngingsAmount = [[NSArray alloc] initWithObjects: @"$0",@"$0", @"$45.50",@"$125.00", nil]; NSMutableArray *myGames = [[[NSMutableArray alloc] init] autorelease]; for (int i = 0; i < [prizeLevels count]; i++) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:[prizeLevels objectAtIndex:i] forKey:@"prizeLevel"]; [dict setObject:[winsAmount objectAtIndex:i] forKey:@"winsAmount"]; [dict setObject:[winngingsAmount objectAtIndex:i] forKey:@"winningsAmount"]; [myGames addObject:dict]; [dict release]; } [prizeLevels release]; [winsAmount release]; [winngingsAmount release]; [myGames addObject:@"Spent: $1250.00"]; return myGames; } @end 

任何帮助,将不胜感激。

在调用super的析构函数之前清理类自己的variables是一个好习惯。 更多的细节可以在这里find: 为什么我必须最后调用super-dealloc,而不是第一个? 。