-2

クラスの 1 つに「最後に作成されたオブジェクトの静的参照を常に保持する」パターンがありますその新しいインスタンスを作成すると、静的ポインターがこの新しいインスタンスに設定されているはずです。以下の方法で解決しました。

static AViewController *actualSelf = nil;

+ (AViewController *) getActualSelf {
    return actualSelf;
}

- (AViewController *) init {
    self = [super init];
    self.title = @"Title";

    actualSelf = nil; // Why do I need this line the second time init gets called?

    actualSelf = self; // this is the only line which sets actualSelf

    return self;
}

- (void)dealloc {
    actualSelf = nil;
}

…SOME IMPORTANT MUST BE MISSING, BUT I DON'T KNOW WHAT
  • AViewController a を作成する > Init が呼び出される > 静的ポインターが a に設定される
  • AViewController b を作成します > Init が呼び出されます > 静的ポインターを b に設定する必要があります。しかし、静的ポインタは b に設定されていません! aから nil に設定されます。

ほとんどの場合、オブジェクト a は b が作成される前に割り当て解除されます。

静的変数の割り当てを解除するときは、常に静的変数を nil にリセットする必要がありますか? いいえ、以下の私自身の回答を参照してください。

「actualSelf = nil;」という行がないと、ARC オブジェクト a を介して、actualSelf がオブジェクト b に設定された瞬間に割り当てが解除されます。

4

2 に答える 2

2
actualSelf = nil; // WHY DO I NEED THIS LINE?

この行は必要ありません。何も達成せず、おそらくリリース ビルドのコンパイラ オプティマイザーによって削除されるでしょう。

クラスはシングルトンではありません。

質問が変更されたため、残りの回答は削除されました。

于 2013-02-24T14:04:39.290 に答える
1
  • AViewController a を作成する > Init が呼び出される > 静的ポインターが a に設定される
  • AViewController b を作成します > Init が呼び出されます > 静的ポインターを b に設定する必要があります。しかし、静的ポインターは b に設定されていません! aから nil に設定されます。

actualSelfおそらく、 の所有権を持っていること以外には何もありませんa。したがって、原因actualSelf = self;の初期化中に完全に解放され、割り当てが解除されます。の間は、に設定されます。どうやら、これはnew (object ) への割り当ての後に来るようです。(割り当てに対するARC 提供の呼び出しの操作の正確な順序は予測できません。)ba-deallocaactualSelfnilactualSelfselfb-releaseactualSelf

メソッドで代入actualSelfしてnilいるという事実自体-deallocが悪いにおいがします。オブジェクトへの強い参照を保持しているactualSelf場合__weak、そのオブジェクトの割り当てを解除できないためです。

少なくとも、リセットする前に等しい-deallocかどうかをテストする必要があります。しかし、強く参照されているオブジェクトは割り当てを解除できないため、強い参照である限り、これは当てはまりません。actualSelfselfactualSelf

このアプローチ全体には深刻な問題があります。あなたは本当に何を達成しようとしていますか?

于 2013-02-24T19:29:56.063 に答える