6

UICollectionViewControllerアプリの状態ごとに異なるレイアウトを使用するコレクション ビューを管理しています。-setCollectionViewLayout:animated:異なるレイアウト間を移行するために使用しています。悪いアクセス エラーが発生しました。コレクション ビューの現在のレイアウトを実際に所有しているもの(参照を保持しているものなど) を知ることは非常に役立ちます。strong

を呼び出した後-setCollectionViewLayout:animated:、次のことに気付きました ( はどこにselfありますかUICollectionViewController):

  • self.collectionView.collectionViewLayout新しいレイアウトを返します。
  • self.collectionViewLayoutまだ古いレイアウトを返します。

これにより、この動作を説明するUICollectionView Class Referenceを確認するようになりました。

collectionViewLayout

コレクション ビュー コントローラーの初期化に使用されるレイアウト オブジェクト。(読み取り専用)

@property (nonatomic,readonly) UICollectionViewLayout *collectionViewLayout

解説
このプロパティには、initWithCollectionViewLayout: メソッドに渡したレイアウト オブジェクトが含まれます。このプロパティのレイアウト オブジェクトは、コレクション ビュー自体への変更を反映するために更新されません。このプロパティを使用して、最初にコレクション ビューで使用するように構成したレイアウト オブジェクトを参照できます。

わかった。したがってself.collectionViewLayout、初期レイアウトへの弱参照 (またはそうですか?) でありself.collectionView.collectionViewLayout、現在のレイアウトへの強参照です。

これを確認するために、デバッガーに飛び込みましたが、実際にUICollectionView所有されていると思われるUICollectionViewController. 代わりに、コレクション ビュー コントローラーの_view変数は のインスタンスでしUICollectionViewControllerWrapperViewた。なに?

この経験全体から、次のような疑問が残りました。

  1. に実際UICollectionViewに格納されているのはどこUICollectionViewControllerですか?
  2. 初期レイアウトへの参照をself.collectionViewLayout保持しますか?strong
4

2 に答える 2

3

よし、最初の質問にはすでに答えた:UICollectionViewControllerWrapperViewは と呼ばれる ivarを持っています。これは、インデックス 0_subviewCacheの実際の値を含む変更可能な配列です。UICollectionView

ただし、2番目の質問への回答は引き続き歓迎します。(初期レイアウト) プロパティが読み取り専用であるため、コレクション ビュー コントローラーが初期レイアウトへの強い参照を保持していないcollectionViewLayoutように思えます。デバッガーの変数ビュー。それでも、この場合、コレクション ビューの初期レイアウトへの強い参照が別のレイアウトへの強い参照に置き換えられた後でも、どのように初期レイアウトを保持しているのでしょうか?


更新:私が見た不正アクセス クラッシュは、実際にはのレイアウトUIDynamicAnimatorの所有権に関係するわずかに異なる問題によって引き起こされたことが判明しました。これはほぼ間違いなく Apple のコードのバグであり、私はレーダーを提出しました。ここで読むことができます (重複を歓迎します!):

http://www.openradar.me/15062440

とはいえ、これは私の 2 番目の質問に技術的に対処するものではありません。それはもはや私や私の仕事には関係ありませんが、現時点では純粋に学術的なものであっても、本当の答えを歓迎し、支持します.

于 2013-09-23T20:10:01.670 に答える
0

UICollectionViewController に格納されている実際の UICollectionView はどこにありますか?

これは本当にあなたのビジネスではありません。つまり、コレクション ビューへのポインターを見つけたことは興味深いことです。おそらく、コントローラーのビュー階層を検索することで、別のポインターを見つけることができるでしょう。重要なことはUICollectionViewController、コレクション ビューについて心配する必要があるということです。アプリがクラッシュする理由を突き止めようとしているとき、それが満足のいく答えではないことはわかっていますが、デバッグは別として、ビュー コントローラーのビューをいじらないようにすることは常に良い考えです。

self.collectionViewLayout は初期レイアウトへの強い参照を保持していますか?

ドキュメントから判断すると、はい。Objective-C のプロパティは既定で強力であり、プロパティの仕様から、プロパティcollectionViewLayoutが指定していないことがわかりweakますstrong

さらなる証拠は、引用したドキュメントから得られます。これは、基本的に、プロパティが初期化時に提供したレイアウトへのポインターを提供することを示しています。レイアウトを変更した場合にプロパティが返されるとは言いませんnil。レイアウトを変更しても、プロパティが更新されず、元のレイアウトを指し続けると言うのは的外れです。

于 2014-07-10T20:10:06.160 に答える