2014-04-25 18 views
3

雖然我似乎能夠建立一個dataSourceUICollectionView就好在我的視圖控制器:爲什麼UICollectionViewDataSource會在我嘗試調用它的方法時解除分配?

- (void)setupCollectionView:(UICollectionView*)collectionView { 
    CustomCollectionViewDataSource *dataSource = [[CustomCollectionViewDataSource alloc] initWithCollectionView: collectionView]; 
    [collectionView setDataSource: dataSource]; 
    [collectionView setDelegate: self]; 
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:kNNReuseIdentifier]; 
} 

當我登錄collectionViewdataSourcecollectionView.dataSource,他們看起來都完全一樣,他們都應該。我的收藏視圖中只有一個部分,因此我不在數據源中實現numberOfSectionsInCollectionView

一旦我的收藏視圖加載,我得到的應用程序崩潰。沒有或沒有斷點例外的崩潰沒有相關日誌。當異常斷點處於打開狀態時,它不會指向我的代碼導致問題的位置。在碰撞時,我的籌碼看起來是這樣的:

* thread #1: tid = 0x22cc82, 0x01611411 CoreFoundation`___forwarding___ + 769, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) 
    * frame #0: 0x01611411 CoreFoundation`___forwarding___ + 769 
    frame #1: 0x016110ee CoreFoundation`__forwarding_prep_0___ + 14 
    frame #2: 0x00b0bc34 UIKit`-[UICollectionViewData _updateItemCounts] + 331 
    frame #3: 0x00b0bce1 UIKit`-[UICollectionViewData _validateItemCounts] + 45 
    frame #4: 0x00b0dc64 UIKit`-[UICollectionViewData numberOfSections] + 35 
    frame #5: 0x00ad86ed UIKit`-[UICollectionView numberOfSections] + 62 
    frame #6: 0x00af8614 UIKit`-[UICollectionViewFlowLayout(Internal) _getSizingInfos] + 205 
    frame #7: 0x00af948f UIKit`-[UICollectionViewFlowLayout(Internal) _fetchItemsInfo] + 521 
    frame #8: 0x00af4fe2 UIKit`-[UICollectionViewFlowLayout prepareLayout] + 157 
    frame #9: 0x00b0bd9d UIKit`-[UICollectionViewData _prepareToLoadData] + 76 
    frame #10: 0x00b0c5c5 UIKit`-[UICollectionViewData validateLayoutInRect:] + 56 
    frame #11: 0x00ad2603 UIKit`-[UICollectionView layoutSubviews] + 173 
    frame #12: 0x004f5964 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355 
    frame #13: 0x013b282b libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70 
    frame #14: 0x0438145a QuartzCore`-[CALayer layoutSublayers] + 148 
    frame #15: 0x04375244 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 380 
    frame #16: 0x043750b0 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 26 
    frame #17: 0x042db7fa QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 294 
    frame #18: 0x042dcb85 QuartzCore`CA::Transaction::commit() + 393 
    frame #19: 0x0439a5b0 QuartzCore`+[CATransaction flush] + 52 
    frame #20: 0x004849bb UIKit`_UIApplicationHandleEventQueue + 13095 
    frame #21: 0x015aa77f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    frame #22: 0x015aa10b CoreFoundation`__CFRunLoopDoSources0 + 235 
    frame #23: 0x015c71ae CoreFoundation`__CFRunLoopRun + 910 
    frame #24: 0x015c69d3 CoreFoundation`CFRunLoopRunSpecific + 467 
    frame #25: 0x015c67eb CoreFoundation`CFRunLoopRunInMode + 123 
    frame #26: 0x02b5c5ee GraphicsServices`GSEventRunModal + 192 
    frame #27: 0x02b5c42b GraphicsServices`GSEventRun + 104 
    frame #28: 0x00486f9b UIKit`UIApplicationMain + 1225 
    frame #29: 0x000026bd Niknik`main(argc=1, argv=0xbfffee74) + 141 at main.m:9 

而且,這個問題似乎是,數據來源是獲得某種方式釋放,因爲當我打開殭屍,我得到這個:

- [CustomCollectionViewDataSource collectionView:numberOfItemsInSection:]:發送到釋放實例的消息0xa0a8d10

我在做什麼錯?

回答

6

您正在創建dataSource作爲局部變量,因此一旦setupCollectionView退出,它將超出範圍並可以解除分配。 collectionView將只保留weak引用,因此沒有任何東西可以阻止釋放。

你應該爲你的數據源創建一個屬性 -

@property (strong,nonatomic) CustomCollectionViewDataSource *dataSource 

,然後在你的設置方法使用 -

- (void)setupCollectionView:(UICollectionView*)collectionView { 
    self.dataSource = [[CustomCollectionViewDataSource alloc] initWithCollectionView: collectionView]; 
    [collectionView setDataSource: self.dataSource]; 
    [collectionView setDelegate: self]; 
    [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:kNNReuseIdentifier]; 
} 
+0

+1,此外,無需爲數據源,以保持一個指針回到收藏視圖。集合視圖將作爲參數傳遞給所有數據源的方法。 – danh

+0

我同意。對於數據源來說,引用顯示數據的視圖可能是一種糟糕的設計,除非數據源也恰好是(父)視圖控制器 – BridgeTheGap

相關問題