EXC_BAD_ACCESS Crash in UITableView when row count is 0

I have a permanent crash with my UITableView when I set the number of rows in a table to zero. It crashes with error EXC_BAD_ACCESS. The failure is internal to the UITableView, so I cannot directly understand what went wrong, although this should be a stupid mistake on my part.

The stack trace is as follows:

#0 0x0194ca60 in objc_msgSend () #1 0x00656837 in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] () #2 0x0064c77f in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] () #3 0x00661450 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] () #4 0x00659538 in -[UITableView layoutSubviews] () #5 0x00d39451 in -[CALayer layoutSublayers] () #6 0x00d3917c in CALayerLayoutIfNeeded () #7 0x00d3237c in CA::Context::commit_transaction () #8 0x00d320d0 in CA::Transaction::commit () #9 0x00d627d5 in CA::Transaction::observer_callback () #10 0x013a3fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ () #11 0x013390e7 in __CFRunLoopDoObservers () #12 0x01301bd7 in __CFRunLoopRun () #13 0x01301240 in CFRunLoopRunSpecific () #14 0x01301161 in CFRunLoopRunInMode () #15 0x01d42268 in GSEventRunModal () #16 0x01d4232d in GSEventRun () #17 0x005f142e in UIApplicationMain () #18 0x000518ec in main (argc=1, argv=0xbfffef84) at /Users/megahub/xcode/QuamSec/main.m:15 

And my code is as follows:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { m_oPositionTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 367) style:UITableViewStylePlain]; m_oPositionTableView.delegate = self; m_oPositionTableView.dataSource = self; m_oPositionTableView.separatorStyle = UITableViewCellSeparatorStyleNone; [self addSubview:m_oPositionTableView]; m_oAppDelegate = (AyersGTSAppDelegate *)[[UIApplication sharedApplication] delegate]; } return self; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. if (m_oPositionItems == nil) return 0; else return [m_oPositionItems count]; } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"QuamPortfolioPositionCell"; QuamPortfolioPositionCell *cell = (QuamPortfolioPositionCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[NSBundle mainBundle] loadNibNamed:@"QuamPortfolioPositionCell" owner:self options:nil] lastObject]; } // Configure the cell... SPPositionItem *oPositionItem = [m_oPositionItems objectAtIndex:indexPath.row]; cell.oSymbol.text = oPositionItem.sProdCode; cell.oMktPrice.text = oPositionItem.sMktPrice; cell.oNet.text = oPositionItem.sNet; cell.oAmount.text = oPositionItem.sMktVal; return cell; } 

A failure occurs only when the number of rows in the table is 0. If I rigidly set the number of rows returned to 1, the alarm does not appear.

+4
source share
2 answers

It turns out that I forgot to return the table cell to the previous initialization function. Everything is fixed.

+3
source

good because

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

cannot return 0 This is because UITableview cannot draw an empty table without any cell

So

  if (m_oPositionItems == nil) return 1; else return [m_oPositionItems count]; 

gotta do the trick.

-7
source

Source: https://habr.com/ru/post/1333648/


All Articles