Reputation: 577
I am developing an iPhone/ iPod app. The following code is the .m file of a UIViewController. I get the following:
Thread 1: EXC_BAD_ACCESS (code=2......
when I hit the following line:
cell.textLabel.text = [datasource objectAtIndex:indexPath.row];
I understand that this typically happens when you try to access an object after you released it, but I do not release it before I try to access it. I have attached the complete code below.
Any help is thankful!
#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
Upvotes: 3
Views: 6575
Reputation: 1644
What type of your files options and datasource? Also try self.options etc.
Upvotes: 0
Reputation: 162712
-(void)setupArray{
options = [NSMutableArray arrayWithObjects:@"Husbandry Records", @"Task Manager", @"Feeder Inventory", @"Animal Inventory", nil];
datasource = options;
}
You are assigning an autoreleased object to the datasource
instance variable directly and then attempting to use it after it is released in the line of code that is crashing. If you turned on Zombie detection, it would have very likely have caught this directly. As well, the static analyzer (build and analyze) should have caught it.
(Unless, of course, you have ARC enabled at which point something else is going on...)
Upvotes: 5