私は一日中保持サイクルについて詳しく読んでいて、混乱し始めています。だから、いくつかのことを確認したかっただけです。(明確にするために、私はARCを使用しています)
だから私が持っているとしましょうMyFirstClass
。MyFirstClass
には (デフォルトで) を強く指すインスタンス変数がありますMyChildClass
:
MyChildClass *_child;
MyFirstClass
次のような getter (.h で公開されています) もあります。
-(MyChildClass *)child
{
return _child;
}
ここで、完全に別のクラスがあるとしましょうMySecondClass
。次のようにMySecondClass
指す弱いインスタンス変数があります。MyFirstClass
__weak MyFirstClass *_firstClass;
両方を保持する親クラスがありMyFirstClass
、弱い参照を持っているだけなMySecondClass
ので、必要なときに親クラスがそれを解放するのを止めません。MySecondClass
MyFirstClass
MySecondClass
独自の子クラスもあり、インスタンス変数でも強く参照されます。
MySecondChildClass *_secondClassChild;
MySecondChildClass
MyFirstClass
のMyChildClass
オブジェクトを参照したい。
したがって、ここでも弱いポインターを使用していると思いますMySecondChildClass
。
__weak MyChildClass *_firstClassChild;
これを設定するためのカスタム init があります。
-(id)initWithFirstClassChild:(MyChildClass *)firstClassChild
{
if(self = [super init]){
_firstClassChild = firstClassChild;
}
}
最後に、MySecondClass
を作成するメソッドがありますMySecondChildClass
。
-(void)setupChild
{
_secondClassChild = [[MySecondChildClass alloc] initWithFirstClassChild:_firstClass.child];
}
これはすべて正しいですか?90% 大丈夫だと確信していますが、混乱しています。
を使用しているときはどうですか_firstClass.child
、それへの強力なポインターが作成されますか? __weak
そのメソッド呼び出しのどこかを参照する必要がありますか? MySecondChildClass
の初期化中はどうですか?インスタンス変数を設定する前に一時的なポインターがMyChildClass
ありますが、心配する必要がある強力なポインターを作成しますか?
どんな明確化も素晴らしいでしょう。