この質問の答えは、ここで同様のスレッドを読んだり、グーグルで検索したりすることで見つけることができると思いますが、私の理解では異常なので、いわば「聞いて」みたいと思います。
これが、前の従業員が書いたコードがあり、私にはかなり奇妙に見える特定の種類の構造がたくさんあるので、「正しいことと間違っていること」を明確にしたいだけです。
例えば
- (void) setWwanServiceId: (NSString *) newValue {
[wwanServiceId autorelease];
wwanServiceId = [newValue copy];
}
wwanServiceId
これがクラスのメンバーです、そしてNSString
私にはこれはそれをするための奇妙な方法のように思えます。私が理解している限り、それautorelease
はオブジェクトに置くことから始まり、基本的に「このオブジェクトが使用されていないように見えるときはいつでも、私のためにそれを解放してください」と言って、コピーは保持カウントを+1します.... wwanServiceId?またはnewValue?私は最初だと思います。
次に、私をさらに混乱させるために、wwanServiceId
-stringのライフサイクルをすばやく実行してみましょう。
基本的に、通知を受信すると値が設定され、通知ハンドラーメソッドから上記のメソッドが呼び出されます-setWwanServiceId:
。それ以外は、読むためだけにアクセスされるので、いつでもアクセスできると言っても過言ではありません。
- オブジェクトに自動解放を配置します
- 新しい文字列のコピーを保持する
次に、これにはもう1つの癖があります。これは、私がかなり疑わしいところです。つまり、次の-dealloc
ような方法です。
- (void) dealloc {
[[self wwanServiceId] release];
[super dealloc];
}
では、そこで何が起こりますか?私が言っrelease
たwwanServiceId
ように、メモリ管理に触れているのは(私が何も見逃していないが、かなり確信している場合)、自動リリースを入れて保持することだけです。
要約すると、ここでの考え方は、自動リリースを行った後は常に新しいコピーを保持するため、最後にリリースする必要があると考えたということです。それとも、私が考えることができるのはそれだけです。または、万が一の場合に備えて、最終的に追加のリリースを行うのが安全だと感じただけです。
私の知る限り、このセッターが1回呼び出されると、autorelease
(将来は-1)になり、retain
(+ 1)を実行し、デストラクタが呼び出されると、「最終リリース」(-1)を実行します。
私が理解するのに役立つアイデアや提案(実際に私が間違っていて、メモリ処理がそのまま正しい場合)をいただければ幸いです。