Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EXC_BAD_ACCESS on [UICollectionView setCollectionViewLayout:]

I have a collection view where I am using a custom UICollectionViewFlowLayout. This collection view can either load images locally or through internet. If I load the images locally every navigation works well. If however I load the images over the internet, the screen does load properly the first time but if you tap on an image and go to another screen, and then come back from that screen (they are all in a navigation controller) there is a 'bad access' crash. Does anyone know what might be the reason.

In viewDidLoad

[self.photosCollectionView registerNib:[UINib nibWithNibName:@"PhotoAlbumPhotosCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:kReuseIdentifierPhotosAlbumPhotosCollectionViewCell];

In viewWillAppear

[self fetchImagesFromInternetAsynchronously]; 

self.photosCollectionView.dataSource = self;
self.photosCollectionView.delegate = self;

self.photosCollectionViewFlowLayout = [UICollectionViewFlowLayout new];
self.photosCollectionViewFlowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
self.photosCollectionViewFlowLayout.minimumInteritemSpacing = 2.0f;
self.photosCollectionViewFlowLayout.minimumLineSpacing = 2.0f;

CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width;
CGFloat cellDimension = (screenWidth - 2*self.photosCollectionViewTrailingSpaceConstraint.constant - 3*self.photosCollectionViewFlowLayout.minimumInteritemSpacing)/4 - 1.0;
CGSize cellSize = CGSizeMake(cellDimension, cellDimension);
[self.photosCollectionViewFlowLayout setItemSize:cellSize];

[self.photosCollectionView setCollectionViewLayout:self.photosCollectionViewFlowLayout];

In fetchImagesFromInternetAsynchronously, I do a [self.photosCollectionView reloadData] once images have been fetched.

Here is the stack trace:

stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
frame #0: 0x0000000112da0e09 UIKit`-[UICollectionViewData layoutAttributesForItemAtIndexPath:] + 248
frame #1: 0x0000000112d4f2d3 UIKit`-[UICollectionView _setCollectionViewLayout:animated:isInteractive:completion:] + 1893
frame #2: 0x0000000112d4e86b UIKit`-[UICollectionView setCollectionViewLayout:] + 318
* frame #3: 0x000000010be6b0aa app`-[PhotoAlbumPhotosPickerViewController viewWillAppear:](self=0x00007fd5830d3e00, _cmd="viewWillAppear:", animated=YES) + 1514 at PhotoAlbumPhotosPickerViewController.m:90
frame #4: 0x000000010eec85fd UIKit`-[UIViewController _setViewAppearState:isAnimating:] + 710
frame #5: 0x000000010eec8c98 UIKit`-[UIViewController __viewWillAppear:] + 149
frame #6: 0x000000010eef8a37 UIKit`-[UINavigationController _startCustomTransition:] + 1203
frame #7: 0x000000010ef08cdb UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 712
frame #8: 0x000000010ef09cea UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57
frame #9: 0x000000010f0afc85 UIKit`-[UILayoutContainerView layoutSubviews] + 248
frame #10: 0x000000010ede4e40 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 710
like image 395
OutOnAWeekend Avatar asked Feb 24 '16 18:02

OutOnAWeekend


1 Answers

Incredible!

This is what eventually worked. And there was even a similar crash if I added footer view in the collection view which this solved.

Replace

self.photosCollectionViewFlowLayout = [UICollectionViewFlowLayout new];

with

self.photosCollectionViewFlowLayout = (UICollectionViewFlowLayout*)self.photosCollectionView.collectionViewLayout;

Or add this in viewWillDisappear (this however did not get rid of the footer view crash, so better use the first approach.

self.photosCollectionView.delegate = nil;
self.photosCollectionView.dataSource = nil;
like image 51
OutOnAWeekend Avatar answered Oct 18 '22 00:10

OutOnAWeekend