title: UITableViewCellAccessibilityElement release Crashes on Tab Switching
body: <p>I am developing a tabbed application for iOS (5 upwards).
  My app is experiencing crashes in the simulator after a few switches between 2 of the 3 tabs, that both contain tables (and some other - here probably not relevant stuff). following are the important parts of the cell creation and the error code.</p>
  
  <p>The crash happens after a (every time different) number of changes, and always when accessing tab 2.</p>
  
  <p><em><strong>NOTE</em></strong>  i am using ARC.</p>
  
  <p><strong>* UPDATE*</strong> The problem only appears on iOS 6. previous versions are not affected.it could be dependent on some threading code that gets called, and looks like this:</p>
  
  <pre><code>if (!self.progressBackground) {
          self.progressBackground = [[UIView alloc]initWithFrame:CGRectMake(100, 260, 120, 120)];
          [self.progressBackground setBackgroundColor:[UIColor blackColor]];
          [[self.progressBackground layer]setCornerRadius:15];
          UILabel *progressText = [[UILabel alloc]initWithFrame:CGRectMake(0, 80, 120, 30)];
          UIFont *fontName = [UIFont fontWithName:@"Helvetica" size:14.0];
          [progressText setFont:fontName];
          [progressText setText:@"Updating Tags"];
          [progressText setTextColor:[UIColor whiteColor]];
          [progressText setTextAlignment:UITextAlignmentCenter];
          [progressText setBackgroundColor:[UIColor clearColor]];
          [self.progressBackground addSubview:progressText];
          [self.progressBackground setAlpha:.6];                   
      }
      if (!self.progressView) {
          self.progressView = [[UIActivityIndicatorView alloc]initWithFrame:self.progressBackground.frame];
          [self.progressView setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
      }
      [self.view addSubview:self.progressBackground];
      [self.view addSubview:self.progressView];
      [self.progressView  startAnimating];
  
      [NSThread detachNewThreadSelector:@selector(initializeCategoriesArray) toTarget:self withObject:nil]; 
  </code></pre>
  
  <p>and the method 'initializeCategoriesArray' looks like that:</p>
  
  <pre><code>-(void)initializeCategoriesArray{
  
  if (!self.categoryArchive) {
      self.categoryArchive = [[NSMutableArray alloc]init];
  } 
  
  //set the right month' expenses
  self.currentMonthExpenses = (NSMutableArray*)[self.dataHandler fetchAllExpensesForMonth:[NSNumber numberWithInteger:self.currentMonthNumber ]];
  
  
  // check if expenses exist at all
  
  if (self.currentMonthExpenses.count == 0) {
      [self.categoryArchive removeAllObjects];
      [self.categoriesTable reloadData];
      [self.progressView performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
      [self.progressView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:YES];
      [self.progressBackground performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:YES];
      return;
  }
  
  
  
  // sort out month Expenses
  NSMutableArray *dayTypeExpenses = [[NSMutableArray alloc]init];
  for (Expense *exp in self.currentMonthExpenses) {
      if (exp.expenseType.boolValue == NO) {
          [dayTypeExpenses addObject:exp];
      }
  }
  
  
  // check if dayExpenses exist
  if (dayTypeExpenses.count == 0) {
      [self.categoryArchive removeAllObjects];
      [self.categoriesTable reloadData];
      [self.progressView performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
      [self.progressView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:YES];
      [self.progressBackground performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:YES];
      return;
  }
  
  // create Dictionary holding all DayExpenses under their STRING AS KEY
  NSMutableDictionary *tempDict = [[NSMutableDictionary alloc]init];
  for (Expense *exp in dayTypeExpenses) {
  
      NSMutableArray *temp = [tempDict objectForKey:exp.name];
      if (temp == nil) {
          NSMutableArray *tempArray = [[NSMutableArray alloc]init];
          [tempDict setValue:tempArray forKey:exp.name];
      }
      [[tempDict objectForKey:exp.name]addObject:exp];
  }
  
  // create temporary (unsorted) array of Categories
  NSMutableArray *tempCatArray = [[NSMutableArray alloc]init];
  for (NSMutableArray *expArray in [tempDict allValues]) {
      double totValue = 0;
      NSInteger count = 0;
      double average = 0;
      CGFloat percentage = 0;
      for (Expense* exp in expArray) {
          count++;
          totValue = totValue+exp.value.doubleValue;
      }
      average = totValue/count;
      percentage = totValue/self.spentCurrentMonth;
      Category *newCategory = [[Category alloc]init];
      [newCategory setTotalValue:totValue];
      [newCategory setName:[[expArray objectAtIndex:0]name]];
      [newCategory setNumberOfExpenses:count];
      [newCategory setAverageValue:average];
      [newCategory setPercentOfBudgetInFloat:fabs(percentage)];
  
      [tempCatArray addObject:newCategory];
  }
  
  // sort tempArray
  NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"totalValue" ascending:YES];
  NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
  self.categoryArchive = [[tempCatArray sortedArrayUsingDescriptors:sortDescriptors]mutableCopy];
  
  // find normfactor
  
  
  CGFloat normFactor = fabs(1.0/[[self.categoryArchive objectAtIndex:0] percentOfBudgetInFloat]);
  
  for (Category *cat in self.categoryArchive) {
      if (cat.name.length == 0) {
          cat.name = @"Uncategorized";
      }
      if (cat.percentOfBudgetInFloat &gt;= 1) {
          cat.percentOfBudgetInFloat = 1;
      }
      cat.percentOfBudgetInFloat = cat.percentOfBudgetInFloat*normFactor;
  }
  
  
  // reload
  [self.categoriesTable reloadData];
  
  [self.progressView performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
  [self.progressView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:YES];
  [self.progressBackground performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:YES];
  
  }
  </code></pre>
  
  <p><em><strong>Tab 1:</em></strong></p>
  
  <pre><code>TableView, each cell contains 2 labels 1 button
  
  -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString *CellIdentifier = @"dayCell";    
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  
  if (cell == nil) {
      UIFont *subjectFont = [UIFont fontWithName:@"Helvetica" size:14.0];
      UIFont *valueFont = [UIFont fontWithName:@"Helvetica-Bold" size:14.0];
  
      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
      [cell.textLabel removeFromSuperview];
  
  
      // Cell Look
      UIImageView *backgroundImg = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"cell" ]];
      [cell setBackgroundView:backgroundImg];
  
      // Subjectlabel
      UILabel *subjectLabel = [[UILabel alloc]initWithFrame:CGRectMake(30, 15, 160, 20)];
      //...
  
      // ValueLabel
      UILabel *valueLabel = [[UILabel alloc]initWithFrame:CGRectMake(160, 15, 90, 20)];
      //...
  
  
      // Deletion Button
      UIButton *delButton = [[UIButton alloc]initWithFrame:CGRectMake(255, 0, 50, 50)];
      [delButton setBackgroundColor:[UIColor clearColor]];
      [delButton setImage:[UIImage imageNamed:@"delButt" ] forState:UIControlStateNormal ];
      delButton.tag = 1002;
      [cell addSubview:delButton];
  }
  //...
  
  UIButton *delButton = (UIButton*)[cell viewWithTag:1002];
  [delButton addTarget:self action:@selector(deleteRow:) forControlEvents:UIControlEventTouchUpInside];
  
  //...
  return cell;
  }
  </code></pre>
  
  <p><em><strong>Tab 2:</em></strong></p>
  
  <pre><code>TableView, each cell contains 2 labels, 1 rectangular UIView
  
  -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  static NSString *CellIdentifier = @"thisMonthCell";
  
  
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  
  if (cell == nil) {
      UIFont *subjectFont = [UIFont fontWithName:@"Helvetica" size:14.0];
      UIFont *valueFont = [UIFont fontWithName:@"Helvetica-Bold" size:16.0];
  
      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
      [cell.textLabel removeFromSuperview];
  
      // BarGraph for this Cell
      UIView *barProgress = [[UIView alloc]initWithFrame:CGRectMake(20, 1, 1, 37)];
      [barProgress setBackgroundColor:[self goldBarColor]];
      [barProgress setAlpha:.5];
      barProgress.tag = 1000;
      [cell addSubview:barProgress];
  
  
  
  }
  
  Category *cellCategory = [self.categoryArchive objectAtIndex:indexPath.row];
  
  UIView *progressBar = (UIView *)[cell viewWithTag:1000];
  [progressBar setFrame:CGRectMake(progressBar.frame.origin.x, progressBar.frame.origin.y, cellCategory.percentOfBudgetInFloat*280, progressBar.frame.size.height)];
  
  //...
  
  
  return cell;
  
  }
  </code></pre>
  
  <hr>
  
  <p>The errorcode upon crashing reads like this:</p>
  
  <blockquote>
    <p>2012-10-18 14:57:13.218 DailyBudget[4714:c07] <em>*</em> -[UITableViewCellAccessibilityElement release]: message sent to deallocated instance 0x7571630
    dlopen(/Applications/Xcode.app/Contents/PlugIns/DebuggerFoundation.ideplugin/Contents/Resources/DebuggerIntrospectionSupport.dylib, 0x00000002)
    dyld: loaded: /Applications/Xcode.app/Contents/PlugIns/DebuggerFoundation.ideplugin/Contents/Resources/DebuggerIntrospectionSupport.dylib</p>
  </blockquote>
  
  <hr>
  
  <p>The problem appears <strong><em>only</em></strong> in the simulator, not on a real device (both iOS 6.0)</p>
  
  <p>Any ideas what the issue might be?</p>