Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

cruisercoder

macrumors newbie
Original poster
May 11, 2009
3
0
I've simplified the code about as much as I can. It's a simple UITableView controller that inserts rows via a method in a separate thread at rate of 1 per second. The crash occurs when you scroll up after a page of rows have been added. The stack trace is deep within the UIKit run loop. There are no retains, but no releases here either and no instance variables managed, but I could be missing something.

Code:
#import "TableController.h"

unsigned int size_ = 0;

@implementation TableController

-(id) init {
  if (self = [super init]) {
    self.title = @"View";
  }
  return self;
}

- (void)loadView  {
  UITableView *tableView = [[UITableView alloc] init];

  tableView.delegate = self;
  tableView.dataSource = self;
  tableView.rowHeight = 50;
  self.view = tableView; 
  [tableView reloadData];
  
  [NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:nil];
}


-(void) threadRun:(id) param {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  
  unsigned int pos = 0;
  do {
    
    pos = (++size_)-1;
    
    [self performSelectorOnMainThread:@selector(insertRow:)
      withObject:[[NSNumber numberWithInteger:pos] retain]
       waitUntilDone:YES];
    
    sleep(1);
    
  } while (pos != 20);
  
  [pool release]; 
}


- (void) insertRow:(NSNumber*) x {
  
  NSArray *insertIndexPaths = [NSArray arrayWithObjects:
      [NSIndexPath indexPathForRow:x.integerValue inSection:0],
      nil];
  
  UITableView *tv = (UITableView *) self.view; 

  [tv beginUpdates];
  [tv insertRowsAtIndexPaths:insertIndexPaths
      withRowAnimation:UITableViewRowAnimationTop];
  [tv endUpdates];
}


- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"ident"];

  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"ident"] autorelease];
  }
  
  cell.text = @"text";
  return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  return size_;
}

@end
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.