こんにちは。私はこの質問が尋ねられたことは知っていますが、Objective-Cのメモリ管理の明確なイメージはまだありません。私はそれをかなりよく把握しているように感じますが、次のコードについてはまだ正しい答えがほしいと思います。私は明確にするために誰かが好きな一連の例を持っています。インスタンス変数に値を設定iPhoneのメモリ管理(特定の例/質問あり)
:
は私がNSMutableArray
変数を持っていると言います。私のクラスでは、初期化するときにretain
と呼ぶ必要がありますか?
私は1にretain
回数を設定するので、私はそれにretain
を呼び出す必要がありませんまだ[[NSMutableArray alloc] init]
を
fooArray = [[[NSMutableArray alloc] init] retain];
または
fooArray = [[NSMutableArray alloc] init];
を行うやっていますか?一方、私が知っているメソッドを呼び出すと、autorelease
オブジェクトが返ってきたら、確かにretain
と呼ぶ必要があります。これと同じように:
fooString = [[NSString stringWithFormat:@"%d items", someInt] retain];
プロパティ:私は@property
の自動セッターがどのように機能するかについて少し困惑しているので
私はretain
について尋ねます。
fooArray
を@property
に設定してretain
に設定した場合、Objective-Cは自動的に次のセッターを自動的に作成します。
- (void)setFooArray:(NSMutableArray *)anArray {
[fooArray release];
fooArray = [anArray retain];
}
私はこのようなコードを持っていたのであれば、:self.fooArray = [[NSMutableArray alloc] init];
を(私は有効なコードであると信じている)、Objective-CのはfooArray
に割り当てられた値にretain
を呼び出すsetterメソッドを作成します。この場合、retain
のカウントは実際に2になりますか?プロパティの値を設定する
正しい方法:
私はこの上の質問と、(おそらく)議論がある知っているが、@property
を設定するための正しい方法でありますか?
これは?
self.fooArray = [[NSMutableArray alloc] init];
またはこれは?
NSMutableArray *anArray = [[NSMutableArray alloc] init];
self.fooArray = anArray;
[anArray release];
これらの例についていくつか説明しておきたいと思います。ありがとう!
返事ありがとう、Anurag。変数を他のクラスからアクセスできるようにする必要がないときは、プロパティを避けようとしています。 n00bの質問の種類ですが、他のクラスからアクセスできないプロパティを持つことはできますか? – donkim
編集のおかげで、Anurag。あなたが気にしないなら、私はいくつかの明確な点を求めています。.mの@interfaceにcanSave変数を宣言できますか?公開されていない変数は暗黙のうちに既にプライベートであり、そのようにマークする必要があるように少し冗長に思えます。 – donkim
私はプライベートインスタンス変数部分についてお聞きしますが、残念ながらこれはObjective-Cで実装の詳細をプライベートに保つために得られる最も近いものです。変数をプライベートとしてマークしないと、デフォルトでは保護されたアクセス権が得られます。これは必要な場合とそうでない場合があります。 – Anurag