EXC_BAD_ACCESS Crash in UITableView when number of rows is 0

I am having a consistent crash with my UITableView when I set the number of rows in the table to zero. It crashes with an EXC_BAD_ACCESS error. The crash is internal to the UITableView, so I cannot directly see what went wrong, though it should be a stupid mistake on my part.

The stack trace is as follows:

  • How to resize a cell.imageView in a TableView and apply tintColor in Swift
  • Forward vertical scrolls from UIScrollView to a sibling UITableView
  • How to “cancel” a UIStoryBoardSegue
  • RxSwift + UITableViewCell how to get cell object in heightForRowAt
  • Adding gradient to scrolling UITableView
  • Two tables on one view in swift
  • #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;
    }
    

    The crash only happens when the number of rows in the table is 0. If I hardcode the number of rows returned to 1, the crash does not appear.

    2 Solutions Collect From Internet About “EXC_BAD_ACCESS Crash in UITableView when number of rows is 0”

    Turns out that I forgot to return a table cell in a previous initialization function. All fixed now.

    well that’s because

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

    cannot return 0
    That’s because UITableview cannot draw an empty table without any cell

    so

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

    should do the trick.