2016-08-17 8 views
0

UICollectionViewおよびUICollectionViewLayoutのクラス参照によると、UICollectionViewはそのcollectionViewLayoutプロパティへの強い参照を保持し、UICollectionViewLayoutはそのcollectionViewプロパティへの強い参照も保持します。 UICollectionViewでUICollectionViewとそのcollectionViewLayoutの間に保持サイクルがありますか?

、UICollectionViewLayoutで

@property(nonatomic, strong) UICollectionViewLayout *collectionViewLayout 

、(強いが、デフォルトのプロパティの属性です)。

@property(nonatomic, readonly) UICollectionView *collectionView 

ここでは保持サイクルのように見えます。代わりにUICollectionViewLayoutがcollectionViewの弱い参照を保持しないのはなぜですか?

+1

readonlyプロパティのデフォルト属性は決して決してありません。読み込み専用プロパティにはバッキングivarがなく、 'strong'または' weak'のみバッキングivarsに適用されます。 'UICollectionViewLayout'は親の' UICollectionView'の 'weak'参照を保持し、それをreadonlyプロパティのゲッターから返し、保持サイクルを回避します。 –

答えて

1

UICollectionViewLayoutでは、(strongはデフォルトのプロパティ属性です)。

@property(nonatomic, readonly) UICollectionView *collectionView 

これはデフォルトですが、readonlyプロパティは、それだけでゲッターにストレージされていません。内部的には、レイアウトにはコレクションビューに対する弱い参照が必要です。私は、その実際のソースコードのいずれかの知識を持っていないが、それは次のようになります。

@interface UICollectionViewLayout() 
@property(nonatomic, weak, readwrite) UICollectionView *collectionView; 
@end 

しかし、あなたが楽器を走ったし、それは間違いなく私の本のバグですので、実際にあなたがレーダーを提出しなければならない漏れを発見した場合。

+0

良い答え!しかし、readonlyプロパティには常にストレージがありませんか? readonlyプロパティのgetterが実装されておらず、プロパティが内部的にreadwriteとして再宣言されていない場合、それはivarを持つでしょうか? –

+0

ああ、私は「いいえ」と答えようとしていましたが、コンパイラがivarで 'readonly'プロパティを自動的に合成するように見えます。私は実行時にそれが強かったかどうかを調べるために何かを見つけようとします、私は今も好奇心が強いです。私は何かを見つけたら答えを更新します。 –

+0

ありがとう!強くなければならないと思う。 –

1

Does Objective-C readonly property need to specify retain or copy?の回答に記載されているように、strongweakは、読み取り専用のプロパティには適用されません。少なくとも、プロパティの公開宣言には基づいていません。

実際に読み込み専用プロパティで重要なことは、実際にどのように実装されているかです。プロパティがプライベートクラス拡張で次のように再宣言されている可能性があります。

@property (nonatomic, weak, readwrite) UICollectionView *collectionView; 

これにより、コレクションビューとそのレイアウトの間の保持サイクルが回避されます。

+0

良い答え! readonlyプロパティにgetterがなく、内部的にreadwriteとして再宣言されていない場合は、強すぎるプロパティにも適用する必要があります。 –

+0

読み取り専用プロパティーには、セッターがなく、ゲッターがあります。 ivarはデフォルトで強いです。 – rmaddy

+0

私はそのゲッターが実装されていないので、コンパイラはそれのためにivarを合成することを意味します。 –

関連する問題