iOS - EXC_BAD_ACCESS错误

com*_*ead 3 error-handling exc-bad-access objective-c ios

我正在开发iPhone/iPod应用程序.以下代码是UIViewController的.m文件.我得到以下内容:

Thread 1: EXC_BAD_ACCESS (code=2......
Run Code Online (Sandbox Code Playgroud)

当我点击以下行时:

cell.textLabel.text = [datasource objectAtIndex:indexPath.row];
Run Code Online (Sandbox Code Playgroud)

我知道这通常发生在您发布对象后尝试访问对象时,但在尝试访问它之前我不会释放它.我已附上以下完整代码.

任何帮助都很感激!

#import "HomePage.h"
#import "HusbandryRecordsMain.h"
#import "TaskManagerMain.h"
#import "AnimalInventoryMain.h"
#import "FeedInventoryMain.h"

@implementation HomePage
@synthesize options, datasource;

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad {
    [self setupArray];
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
}

-(void)setupArray{
    options = [NSMutableArray  arrayWithObjects:@"Husbandry Records", @"Task Manager", @"Feeder Inventory", @"Animal Inventory", nil];

    datasource = options;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    //#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return 4;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];    
    }

    [[cell textLabel] setBackgroundColor:[UIColor clearColor]];
    [[cell detailTextLabel] setBackgroundColor:[UIColor clearColor]];

    // THE FOLLOWING LINE IS THROWING THE ERROR!
    cell.textLabel.text = [datasource objectAtIndex:indexPath.row]; 

    //Arrow 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.row == 0){
        HusbandryRecordsMain *hrm = [self.storyboard instantiateViewControllerWithIdentifier:@"Husbandry Records - Main"];
        [self.navigationController pushViewController:hrm animated:YES];
    }
    else if (indexPath.row == 1){
        TaskManagerMain *tmm = [self.storyboard instantiateViewControllerWithIdentifier:@"Task Manager - Main"];
        [self.navigationController pushViewController:tmm animated:YES];
    } 
    else if (indexPath.row == 2){
        FeedInventoryMain *fim = [self.storyboard instantiateViewControllerWithIdentifier:@"Feeder Inventory - Main"];
        [self.navigationController pushViewController:fim animated:YES];
    }  
    else if (indexPath.row == 3){
        AnimalInventoryMain *aim = [self.storyboard instantiateViewControllerWithIdentifier:@"Animal Inventory - Main"];
        [self.navigationController pushViewController:aim animated:YES];
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

//----------------------TABLEVIEWCELL HEIGHT -------------------------------------------

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return 70;

}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 5

-(void)setupArray{
    options = [NSMutableArray  arrayWithObjects:@"Husbandry Records", @"Task Manager", @"Feeder Inventory", @"Animal Inventory", nil];

    datasource = options;
}
Run Code Online (Sandbox Code Playgroud)

您正在将一个自动释放的对象datasource直接分配给实例变量,然后在崩溃的代码行中释放后尝试使用它.如果你打开僵尸检测,它很可能直接捕获了它.同样,静态分析器(构建和分析)应该已经捕获它.

(当然,除非你启用了ARC,否则会发生其他事情...)

  • 你需要'保留'选项; 通过使用`self.datasource = options;`或`datasource = [options retain];`.如果这是新代码,您应该整体使用ARC.但是,你真的应该去学习Objective-C和内存管理的基础知识,否则这将是许多问题/崩溃者中的第一个会引起头痛的问题(在你跑步之前走路等等). (2认同)