2011-10-02 71 views
0

我在視圖之間來回切換時遇到了EXC_BAD_ACCESS崩潰。我遇到了一個發現這個崩潰的原因的問題。在模擬器中,它總是返回到main.m文件並報告崩潰。EXC_BAD_ACCESS在視圖之間來回切換時崩潰

但是在我的設備上,當我在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. 
    // e.g. 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 [email protected]"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 

任何幫助,將不勝感激。

+0

你有沒有試過http://stackoverflow.com/questions/909856/why-do-i-have-to-call-super-dealloc-last-and-not-first? – Guven

+0

@Guven感謝您的幫助。這似乎解決了我的問題。我無法相信這麼簡單的事情讓我頭痛不已。 – syclonefx

+0

完美,很高興聽到您的問題得到解決。我會將其添加爲答案,以便您可以將問題的狀態更新爲「已回答」(通過選擇正確答案)。這樣,其他具有相同問題的人也將被引導到答案。 – Guven

回答