Application crashes while scrolling UITableView with cells that have UICollectionView with FlowLayout

The application is written in Swift 2.2 using Xcode 7.3.1.

I have UITableViewwith cells with UICollectionViewwith horizontal FlowLayout. When I scan the table up and down very quickly and not allowing it to stop on the device (iPad Air 2, iOS 9.3.2) or the simulator, the application crashes with

 EXC_BAD_ACCESS

in AppDelegate.

The application does not hit the breakpoint set in the view controller for didReceiveMemoryWarning().

The code seems to fall on

[UICollectionViewData invalidateItemsAtIndexPaths:]

or

[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:]

followed by

0_dispatch_barrier_async_f_slow.

The stack trace does not point me to any line of application code.

Trace of the console stack for the simulator (upon failure on the device, there is no trace of the stack stack):

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[_UIFlowLayoutItem frame]: unrecognized selector sent to class 0x110f9ecc0'
*** First throw call stack:
(
0   CoreFoundation                      0x000000011259cd85 __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x00000001137d3deb objc_exception_throw + 48
2   CoreFoundation                      0x00000001125a5c3d +[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3   CoreFoundation                      0x00000001124ebcfa ___forwarding___ + 970
4   CoreFoundation                      0x000000011259e1f8 __forwarding_prep_1___ + 120
5   UIKit                               0x0000000110b1d8b5 -[UICollectionViewData invalidateItemsAtIndexPaths:] + 273
6   UIKit                               0x0000000110ae26b7 -[UICollectionView _invalidateWithBlock:] + 62
7   UIKit                               0x0000000110ae2a6f -[UICollectionView _invalidateLayoutWithContext:] + 656
8   UIKit                               0x0000000110af0ad9 -[UICollectionViewLayout invalidateLayoutWithContext:] + 189
9   UIKit                               0x0000000110afe2cc -[UICollectionViewFlowLayout invalidateLayoutWithContext:] + 604
10  libdispatch.dylib                   0x0000000114257d9d _dispatch_call_block_and_release + 12
11  libdispatch.dylib                   0x00000001142783eb _dispatch_client_callout + 8
12  libdispatch.dylib                   0x00000001142601ef _dispatch_main_queue_callback_4CF + 1738
13  CoreFoundation                      0x00000001124f60f9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
14  CoreFoundation                      0x00000001124b7b99 __CFRunLoopRun + 2073
15  CoreFoundation                      0x00000001124b70f8 CFRunLoopRunSpecific + 488
16  GraphicsServices                    0x0000000114bcaad2 GSEventRunModal + 161
17  UIKit                               0x000000011024cf09 UIApplicationMain + 171
18  market-touch                        0x000000010d4cc472 main + 114
19  libdyld.dylib                       0x00000001142ac92d start + 1
20  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

( ).

, -, , ?

EDIT: Doro, cellForRowAtIndexPath:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier(customCellNibName, forIndexPath: indexPath) as! CustomTableViewCell

    //populating cell with data

    return cell 
}

func setCollectionViewLayout(_ layout: UICollectionViewLayout, animated animated: Bool).

IB.

, . , :

-[NSIndexPath frame]: unrecognized selector sent to instance 0xc000000012de4890
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSIndexPath frame]: unrecognized selector sent to instance 0xc000000012de4890'
*** First throw call stack:
(0x1815f6db0 0x180c5bf80 0x1815fdc4c 0x1815fabec 0x1814f8c5c 0x186fcccc0 0x186f9e688 0x1868de558 0x1868da0a4 0x1869ae9ec 0x1024f9a7c 0x1024f9a3c 0x1024ff4e4 0x1815acd50 0x1815aabb8 0x1814d4c50 0x182dbc088 0x1867b6088 0x1000c9f58 0x1810728b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

2:

CustomTableViewCell awakeFromNib() :

if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
    layout.estimatedItemSize = CGSizeMake(50, 22)
}

, , ( ). , . : right vs .

IB, Flow View Collection β†’ - 50x22. , , 22pt. :

override func preferredLayoutAttributesFittingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    let attributes = super.preferredLayoutAttributesFittingAttributes(layoutAttributes)

    button.setTitle(symbol, forState: .Normal)
    button.sizeToFit()

    attributes.frame = button.frame

    return attributes
}

, 22pt ( 50pt), . , , ?

+4
1

.

, - UITableViewCell. tableView, cellForRowAtIndexPath:.

, , UICollectionViewFlowLayout . ,

func setCollectionViewLayout(_ layout: UICollectionViewLayout,
                    animated animated: Bool)

cellForRowAtIndexPath: UICollectionViewLayout collectionView . Zombie Edit Scheme β†’ Diagnostics β†’ Enable Zombie Objects. .

, , , , init uitableviewCell ( ), :

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        // set your flow layout or other stuff here
    }


    return cell;
}

, .

0

All Articles