「自動的に」という用語は少し怖いです。これは、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 の痕跡を含まずにメソッドを返した場合、自動解放されると言われています。実際に規則に従うかどうかは、メソッド作成者次第です。メソッド呼び出しの結果として、何も自動的に保持または解放されることはありません。