0

私は一日中保持サイクルについて詳しく読んでいて、混乱し始めています。だから、いくつかのことを確認したかっただけです。(明確にするために、私はARCを使用しています)

だから私が持っているとしましょうMyFirstClassMyFirstClassには (デフォルトで) を強く指すインスタンス変数がありますMyChildClass:

MyChildClass *_child;

MyFirstClass次のような getter (.h で公開されています) もあります。

-(MyChildClass *)child
{
    return _child;
}

ここで、完全に別のクラスがあるとしましょうMySecondClass。次のようにMySecondClass指す弱いインスタンス変数があります。MyFirstClass

__weak MyFirstClass *_firstClass;

両方を保持する親クラスがありMyFirstClass、弱い参照を持っているだけなMySecondClassので、必要なときに親クラスがそれを解放するのを止めません。MySecondClassMyFirstClass

MySecondClass独自の子クラスもあり、インスタンス変数でも強く参照されます。

MySecondChildClass *_secondClassChild;

MySecondChildClassMyFirstClassMyChildClassオブジェクトを参照したい。

したがって、ここでも弱いポインターを使用していると思います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ありますが、心配する必要がある強力なポインターを作成しますか?

どんな明確化も素晴らしいでしょう。

4

1 に答える 1

2

ここでは弱い参照は必要ないと思います。

これらのオブジェクトを P、A、A'、B、および B' と呼んでいます。

P is an instance of your "Parent Class"
A is an instance of "MyFirstClass"
A' is an instance of "MyChildClass"
B is an instance of "MySecondClass"
B' is an instance of "MySecondChildClass"

したがって、あなたの質問を正しく読むと、あなたの写真は次のようになります

  /----> A ----> A'
 /       ^       ^
P        |       |
 \       |       |
  \----> B ----> B'

その図があなたが書いたものと一致する場合、そこには保持サイクルがないため、これらの参照を弱くする必要はありません。

于 2013-02-08T02:02:05.283 に答える