1

何が自動的に保持および解放されるかはある程度理解しましたが、これに関する公式データが見つからず、何か問題があったと思います。

  1. @property(retain)で宣言されたプロパティを設定すると、古い値が保持および解放されますが、同じオブジェクト内にプロパティを設定することはできません。self.
  2. メソッド内のすべてのオブジェクト(パラメーターを含む)は、作成/渡されたときに保持され、メソッドが戻ったときに解放されます。
  3. メソッドによって返されるオブジェクトは解放されませんが、代わりに、メソッド内のローカル変数以降、返されたメソッドによって解放されます。

私は何か間違ったことをした/何かを忘れましたか?
返品が破棄されるとどうなりますか?のように[object someMethodThatReturnsAnObject];。返されるメソッドに対してローカルではないため、リリースされるかどうかはわかりませんが、xCodeはそれについて警告します。

4

3 に答える 3

3

推測する代わりに、ドキュメントを読んでください。それは決定的です。

@property(retain) で宣言されたプロパティを設定すると、古い値が保持および解放されますが、self なしで同じオブジェクト内のプロパティは設定されません。

並べ替え。「自己なしでプロパティを設定する」ことはありません。つまり、インスタンス変数を直接設定しています。

メソッド内のすべてのオブジェクト (パラメーターを含む) は、作成/渡されたときに保持され、メソッドが戻るときに解放されます。

いいえ; ドキュメントを参照してください。

メソッドによって返されたオブジェクトは解放されませんが、メソッド内のローカル変数から返されたメソッドによって解放されます。

全くない; ドキュメントを参照してください。

于 2011-06-16T20:12:41.833 に答える
2

@property(retain) で宣言されたプロパティを設定すると、古い値が保持および解放されますが、self なしで同じオブジェクト内のプロパティは設定されません。

保持プロパティ用に合成されたセッター メソッドを呼び出すと、古い値が解放され、新しい値が保持されます。アクセサーを経由せずにivarを直接設定すると、ivarを割り当てるだけです。何も保持も解放もしません。self.foo = barまさに [self setFoo:bar]。実行されることは何でも実行されます (上記のようsetFoo:に、合成された保持バージョンの作品が動作します)。はまさにsetFoo:foo = bar foo = bar

メソッド内のすべてのオブジェクト (パラメーターを含む) は、作成/渡されたときに保持され、メソッドが戻るときに解放されます。

これはまったく真実ではありません。それらは保持も解放もされません。保持と解放は魔法のようには起こりません。一方ではallocnewcopy、への呼び出しに応答して発生します。ドット表記を使用することは、内部にある可能性があるメソッド呼び出しの省略形にすぎません。retainreleaseretain

メソッドによって返されたオブジェクトは解放されませんが、メソッド内のローカル変数から返されたメソッドによって解放されます。

本当じゃない。メソッドによって返されたオブジェクトは、保持も解放もされません。慣例により、その名前allocnewまたはが含まれるメソッドは、正味 +1 の保持を返します。copy他のメソッドは正味 0 の保持カウントを返します (オブジェクトには保持と同じ数の自動解放があります)。「現在の」保持カウントは常に 0 より大きいか、そうでない場合、オブジェクトを返すことができませんでした。(これは、真実を少し説明したものです。どちらの場合でも、プライベートな保持があれば、保持カウントは 1 より大きくなる可能性があります。しかし、呼び出し元の観点からは、これはそれについて考えるのに便利な方法です。)

参照するのに最適な場所はPractical Memory Managementで、これはすべて非常に簡潔に説明されています。メモリ管理プログラミング ガイドの残りの部分では、さらに例を示します。

于 2011-06-16T20:16:43.820 に答える
1

「自動的に」という用語は少し怖いです。これは、retain と release が舞台裏でランタイムによって魔法のように適用されていることを意味します。実際、何かが保持されるのは、次のいずれかを含むメッセージが送信されたときだけです。New Alloc Retain Copy (NARC)。解放されるのは、解放メッセージまたは自動解放メッセージのいずれかが送信されたときだけです。では、本当に理解しておく必要があるのは、これらのメソッドがどのような状況で送信されるのかということです。

1. プロパティを設定
する あなたが行った限りでは、あなたは正しいです。なんで?プロパティは、getter および setter メソッドを生成するための構文糖衣に過ぎないためです。たとえば、self.myString = @"Foo";は とまったく同じです[self setMyString:@"Foo"]。理解する必要があるのは、retain セマンティクスを使用してプロパティを宣言すると、実際には次のようなメソッドが与えられるということです。

- (void)setMyString:(NSString *)newString {
    if ( newString != myString ) {
        [myString release];
        myString = [newString retain];
    }
}

したがって、言うself.myString = someOtherStringと、明らかに新しい値が保持されます。「」を使用せずにプロパティを設定するself.とは、実際には ivar の直接割り当てにすぎません。ドット演算子が使用されていないため、メソッドが呼び出されていないため、何も保持されていないことがわかります。

2. と 3. メソッドのスコープと何か関係がありますか?
これらはどちらもまったく真実ではありません。規約では、変数が名前に NARC の痕跡を含まずにメソッドを返した場合、自動解放されると言われています。実際に規則に従うかどうかは、メソッド作成者次第です。メソッド呼び出しの結果として、何も自動的に保持または解放されることはありません。

于 2011-06-16T20:24:20.420 に答える