Thank you in advance for any help / insight you can give in the question that I have. Most recently, my iOS application started crashing with the terrible EXC_BAD_ACCESS error. I did a lot of research on SO and Google and got some great tips, but none of these posts helped me solve my problem. Currently, I understand that EXC_BAD_ACCESS can be one of two things:
1) A pointer is now pointing to memory that was deallocated. 2) A pointer itself is corrupt.
I read and followed the instructions here , here , here , and here . When I execute Build and Run, I can play exc_bad_access in 100% of cases. However, when I included NSZombie in the debugger or in the Tools, I could never reproduce the problem. In addition, NSZombie does not leave any useful information in the console.
In the closest way, I had to identify the problem by literally putting NSLog after each line of code to see where it failed. I believe that it crashes at two different points - both of which return the cell to cellForRowAtIndexPath . Below I provide two methods where, in my opinion, a crash occurs, as well as error output on my console. Any help or guidance would be greatly appreciated, thanks!
Insult Method:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0) { static NSString *CellIdentifier = @"EventDetailCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.textLabel.textColor = [UIColor colorWithRed:150 green:143 blue:135 alpha:1.0]; cell.textLabel.highlightedTextColor = [UIColor whiteColor]; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15]; if (indexPath.row < 4) { UIImageView *disclosureArrow = [[UIImageView alloc] initWithFrame:CGRectMake(280, 15, 10, 14)]; disclosureArrow.image = [UIImage imageNamed:@"tableRowAccessoryArrow"]; [cell.contentView addSubview:disclosureArrow]; } } else { if ((indexPath.section == 0) && (indexPath.row == 4)) { for (UIView *v in [cell.contentView subviews]) { [v removeFromSuperview]; } } } switch (indexPath.row) { case 0: cell.textLabel.text = [NSString stringWithFormat:@"%@", self.startTime]; cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowTop"]]; cell.imageView.image = [UIImage imageNamed:@"clockIcon"]; break; case 1: cell.textLabel.text = @"Location"; cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowMiddle"]]; cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowMiddleSelected"]]; cell.imageView.image = [UIImage imageNamed:@"mapIcon"]; break; case 2: cell.textLabel.text = [NSString stringWithFormat:@"%u attendees", [self.attendees count]]; cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowMiddle"]]; cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowMiddleSelected"]]; cell.imageView.image = [UIImage imageNamed:@"attendeesIcon"]; break; case 3: cell.textLabel.text = [NSString stringWithFormat:@"%u fomos", [self.fomos count]]; cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowBottom"]]; cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"eventDetailRowMiddleSelected"]]; cell.imageView.image = [UIImage imageNamed:@"fomoIcon"]; break; case 4: { cell.selectionStyle = UITableViewCellSelectionStyleNone; UIImage *clockIcon = [UIImage imageNamed:@"clockIcon"]; UIImageView *iconSlot = [[UIImageView alloc] initWithFrame:CGRectMake(3, 18, 18, 18)]; iconSlot.image = clockIcon; [cell.contentView addSubview:iconSlot]; NSString *currentTime = @"Happening Now"; UILabel *currentTimeLabel = [[UILabel alloc] initWithFrame:CGRectMake(25, 8, 150, 36)]; currentTimeLabel.backgroundColor = [UIColor clearColor]; currentTimeLabel.textColor = [UIColor whiteColor]; currentTimeLabel.font = [UIFont fontWithName:@"Helvetica" size:14]; currentTimeLabel.text = currentTime; [cell.contentView addSubview:currentTimeLabel]; UIImage *listView = [UIImage imageNamed:@"listViewSelected"]; self.listViewButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.listViewButton.frame = CGRectMake(180, 8, 36, 36); self.listViewButton.tag = 1; [self.listViewButton addTarget:self action:@selector(togglePhotosView:) forControlEvents:UIControlEventTouchUpInside]; [self.listViewButton setBackgroundImage:listView forState:UIControlStateNormal]; [cell.contentView addSubview:self.listViewButton]; UIImage *gridView = [UIImage imageNamed:@"gridViewIcon"]; self.gridViewButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.gridViewButton.frame = CGRectMake(240, 7.2f, 36, 36); self.gridViewButton.tag = 2; [self.gridViewButton addTarget:self action:@selector(togglePhotosView:) forControlEvents:UIControlEventTouchUpInside]; [self.gridViewButton setBackgroundImage:gridView forState:UIControlStateNormal]; [cell.contentView addSubview:self.gridViewButton]; break; } default: break; } return cell; } else { if ([self.listViewObjects count] == 0) { // Do something when there are no pictures or stories to show static NSString *CellIdentifier = @"NoPhotosYetCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.textLabel.textColor = [UIColor colorWithRed:0.150 green:0.143 blue:0.135 alpha:1.0]; cell.textLabel.highlightedTextColor = [UIColor whiteColor]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.textLabel.text = @"No photos have been added yet."; } return cell; } else { if (self.isGridView == YES) { static NSString *CellIdentifier = @"EventContentGridViewCell"; EventDetailGridRow *cell = (EventDetailGridRow *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[EventDetailGridRow alloc] initWithFrame:CGRectMake(0, 0, 306, 102)]; cell.backgroundColor = [UIColor redColor]; } NSMutableArray *mutablePhotos = [NSMutableArray arrayWithArray:self.photos]; int offset = (indexPath.row * 3); int maxRange = 3; if (([mutablePhotos count] < (offset + maxRange))) { maxRange = ([mutablePhotos count] - offset); } NSArray *firstThree = [mutablePhotos subarrayWithRange:NSMakeRange(offset, maxRange)]; cell.photos = firstThree; return cell; } else { static NSString *CellIdentifier = @"EventContentListViewCell"; EventDetailListRowCell *cell = (EventDetailListRowCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[EventDetailListRowCell alloc] initWithFrame:CGRectMake(0, 0, 306, 400)]; } NSString *authorName; NSString *authorUID; BOOL isPhoto = YES; if ([[self.listViewObjects objectAtIndex:indexPath.row] valueForKey:@"caption"] != nil) { // It a photo object NSDictionary *photo = [self.listViewObjects objectAtIndex:indexPath.row]; NSString *photoID = [photo valueForKey:@"id"]; NSString *photoName = [photo valueForKey:@"image_file_name"]; NSURL *photoURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://s3.amazonaws.com/motlee-development-photos/images/%@/compressed/%@", photoID, photoName]]; authorName = [photo valueForKeyPath:@"owner.name"][0]; authorUID = [photo valueForKeyPath:@"owner.uid"][0]; UIImageView *imageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, 300, 300)]; [imageContainer setImageWithURL:photoURL]; [cell.contentView addSubview:imageContainer]; } else if ([[self.listViewObjects objectAtIndex:indexPath.row] valueForKey:@"body"] != nil) { isPhoto = NO; NSDictionary *story = [self.listViewObjects objectAtIndex:indexPath.row]; authorName = [story valueForKeyPath:@"owner.name"][0]; authorUID = [story valueForKeyPath:@"owner.uid"][0]; UIImageView *imageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, cell.frame.size.width, 148)]; imageContainer.image = [UIImage imageNamed:@"storyContainer"]; [cell.contentView addSubview:imageContainer]; UILabel *storyBody = [[UILabel alloc] initWithFrame:CGRectMake(30, 20, (306 - 60), 148)]; storyBody.numberOfLines = 3; storyBody.backgroundColor = [UIColor clearColor]; storyBody.textAlignment = NSTextAlignmentCenter; storyBody.font = [UIFont fontWithName:@"Helvetica" size:17]; storyBody.textColor = [UIColor whiteColor]; storyBody.text = [NSString stringWithFormat:@"\"%@\"", [story valueForKey:@"body"]]; [cell.contentView addSubview:storyBody]; } else { // Something screwy going on here, should have been one of the above objects } NSURL *profilePicURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://graph.facebook.com/%@/picture", authorUID]]; UIImageView *profilePic; if (isPhoto) profilePic = [[UIImageView alloc] initWithFrame:CGRectMake(20, 347, 40, 40)]; else profilePic = [[UIImageView alloc] initWithFrame:CGRectMake(20, 179, 40, 40)]; [profilePic setImageWithURL:profilePicURL placeholderImage:[UIImage imageNamed:@"placeholder"]]; [cell.contentView addSubview:profilePic]; UILabel *takenByLabel; if (isPhoto) { takenByLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 342, 170, 30)]; } else { takenByLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 174, 170, 30)]; } takenByLabel.textColor = [UIColor lightGrayColor]; takenByLabel.font = [UIFont fontWithName:@"Helvetica" size:12]; takenByLabel.backgroundColor = [UIColor clearColor]; if (isPhoto) takenByLabel.text = @"taken by"; else takenByLabel.text = @"written by"; [cell.contentView addSubview:takenByLabel]; UILabel *photoTakerLabel; if (isPhoto) { photoTakerLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 360, 170, 30)]; } else { photoTakerLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 192, 170, 30)]; } photoTakerLabel.textColor = [UIColor whiteColor]; photoTakerLabel.font = [UIFont fontWithName:@"Helvetica" size:14]; photoTakerLabel.backgroundColor = [UIColor clearColor]; photoTakerLabel.text = authorName; [cell.contentView addSubview:photoTakerLabel]; return cell; } } } }
Log output:
libobjc.A.dylib`objc_msgSend: 0x1f5908c: movl 8(%esp), %ecx 0x1f59090: movl 4(%esp), %eax 0x1f59094: testl %eax, %eax 0x1f59096: je 0x1f590e8 ; objc_msgSend + 92 0x1f59098: movl (%eax), %edx 0x1f5909a: pushl %edi 0x1f5909b: movl 8(%edx), %edi <-- EXC_BAD_ACCESS (code=2, address=0xb0000008)