2013-09-23 68 views
6

我有一個UICollectionViewController管理使用不同的佈局不同的應用程序狀態的集合視圖。我正在使用-setCollectionViewLayout:animated:在不同的佈局之間切換。我遇到訪問錯誤的情況,並且極大地幫助我們知道擁有(例如,保留strong引用)實際的佈局。UICollectionViewController的佈局所有權(self.collectionView.collectionViewLayout與self.collectionViewLayout)

調用-setCollectionViewLayout:animated:後,我注意到以下(其中selfUICollectionViewController):

  • self.collectionView.collectionViewLayout返回新的佈局。
  • self.collectionViewLayout仍然返回舊的佈局。

這使我檢查UICollectionView Class Reference,這也解釋了這種行爲:用於初始化集合視圖控制器

collectionViewLayout

的佈局對象。 (只讀)

@property (nonatomic,readonly) UICollectionViewLayout *collectionViewLayout

討論
此屬性包含您傳遞給initWithCollectionViewLayout佈局對象:方法。此屬性中的佈局對象未更新以反映集合視圖本身的更改。您可以使用此屬性來引用最初配置要使用的集合視圖的佈局對象。

好的。所以self.collectionViewLayout是一個弱引用(或是否?)到初始佈局,self.collectionView.collectionViewLayout是對當前佈局的強烈參考。

爲了證實這一點,我參加了一個潛水進入調試器,但無法找到實際UICollectionViewUICollectionViewController理應擁有。相反,收集視圖控制器的_view變量是UICollectionViewControllerWrapperView的一個實例。 Whaaaat?

這整個的經歷給我留下了以下問題:

  1. 當存儲在UICollectionViewController實際UICollectionView
  2. 是否self.collectionViewLayout保持strong參考最初的佈局?

回答

0

UICollectionView存儲在UICollectionViewController中的實際UICollectionView在哪裏?

這真的不關你的事。我的意思是,你發現一個指向集合視圖的指針很有趣,你可能通過搜索控制器的視圖層次來找到另一個指針。重要的是你應該讓UICollectionViewController擔心收集視圖。當你試圖弄清楚爲什麼你的應用崩潰時,我知道這並不是一個令人滿意的答案,但除了調試之外,避免搞亂視圖控制器的視圖總是一個好主意。

self.collectionViewLayout是否對初始佈局保持有力的引用?

從文檔判斷,。 Objective-C屬性爲strong by default,您可以從屬性規範中看到collectionViewLayout屬性未指定weak,因此它必須是strong

更多的證據來自您引用的文檔,基本上說該屬性提供了一個指向您在初始化時提供的佈局的指針。如果您更改佈局,則不會說該屬性將返回nil - 它說明該屬性未更新,並且即使更改佈局也繼續指向原始佈局。

2

好吧,我已經回答了我的第一個問題:UICollectionViewControllerWrapperView有一個名爲_subviewCache伊娃,這是包含實際UICollectionView索引0古怪的一個可變的數組。

但是,我還是願意愛回答我的第二個問題。在我看來,像收集視圖控制器是而不是保持對初始佈局的強烈參考,因爲它的collectionViewLayout(初始佈局)屬性是隻讀的,並且在檢查集合時我找不到任何對集合視圖佈局的引用在調試器的變量視圖中查看控制器。然而,如果是這種情況,即使集合視圖對初始佈局的強烈引用已被替換爲對不同佈局的強烈引用,它是如何保持初始佈局的?


更新:原來壞的訪問崩潰我所看到的實際上是由具有與UIDynamicAnimator的佈局所有權做一個稍微不同的問題引起的。這是幾乎可以肯定蘋果的代碼中的錯誤,我已經提出了雷達,你可以在這裏閱讀(重複歡迎!):

http://www.openradar.me/15062440

那說,這一切都不在技術上解決了我的第二個問題。這與我或我的工作不再相關,但我仍然歡迎並提出任何真正的答案,即使他們現在純粹是學術性的。