コード実行時にNSLogが "dog"と報告する理由を理解できません。私は保持カウントとdealloc e.t.cについて理解しています。どのような単純なことが私は行方不明ですか?目的が解放されていないオブジェクトC
NSString *newFoo = @"dog";
[newFoo release];
NSLog(newFoo);
コード実行時にNSLogが "dog"と報告する理由を理解できません。私は保持カウントとdealloc e.t.cについて理解しています。どのような単純なことが私は行方不明ですか?目的が解放されていないオブジェクトC
NSString *newFoo = @"dog";
[newFoo release];
NSLog(newFoo);
[@"String Literal" release];
はnoopです。
NSString *literal = @"String Literal";
[literal release];
もヌープである。これはのみです文字列リテラルの場合です。あなたはこの行動を他のどこにも期待するべきではありません。
まあまあ、あなたは私よりもはっきり言っているかもしれませんが。 –
プログラミング時にこの動作を考慮する必要はありません。保持カウントは実装の詳細ですが、注意する必要があるのは、保持とあなたのリリースのバランスをとることだけです。 – bbum
あなたは、でメモリのチャンクのポインタのポインティングを割り当て、解除されているが、データはまだそこあります。
これを解放すると、メモリのその部分が自動的にゼロになることはありません。
まだデータを読み出すことはできますが、行の下の何かによってスナップ(割り当て)されている可能性がありますが、まだまだです。
私はObjCコーダーではなく、Cと互換性があるため、Cの経験から推測しています。
@ "dog"は、コンパイラによって定数として効果的に扱われるからだと思います。アプリケーションの存続期間中存続するNSStringのサブクラス(クラスクラスタ)を作成します。
決定的な回答はthis questionで、本質的に私と同じです。
オブジェクトはおそらくリリースされていますが(Obj-Cが文字列を内部的にどのように処理するかは不明ですが、基本的には文字列をキャッシュする言語もあります)あなたはそれを解放した後、newFoo
の記憶に新しい何かを書いていません。文字列が格納されたメモリは内容は保持されますが、いつでも上書きできます。
newFoo
はまだメモリ内の同じアドレスを指していますが、そのメモリはいつでも他のものになる可能性があります。
実際に汚れの可能性があるメモリを指摘しないようにするには、リリース後にnewFoo
をnil
に設定することです。
A列リテラルはhttp://thaesofereode.info/clocFAQ/
...特殊なケースである。しかし、一般的に、あなただけの適宜
http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
詳細..いくつかの簡単なルールに固執ガベージコレクションを使用していないと仮定すると...オブジェクトを保持する必要があるときオブジェクトを保持する - 完了時にリリースとバランスをとる。作成または保持していない場合は、リリースする必要はありません。
送信する - オブジェクトを送信することは、メモリを解放することとは異なり、完了したことだけを通知します。それはまあまあの周りかもしれないし、そうでないかもしれません。あなたは知る方法がなく、知る必要はなく、他の場所で使用されているかどうかを調べるべきではありません。りんごのリンゴコードがキャッシュすることを決めた場合、シングルトンの場合などです。
まだ有効かもしれませんが、あなたがリリースを送ったとき、あなたは効果的に「私は終わった」と言っていて、「この記憶を取り戻す」とは言いませんでした。
お返事ありがとうございます。 ImはObjective-cのグリップに挑戦しようとしており、何が起こっているのかを理解するためにこれを書いていました。 –
@Spyker回答を受け入れられるようにマークする必要があります:-) – chakrit
なぜ「Objective-Cが分からないのですか」と言っている人がいますが、その実装について前提を置いているのはなぜですか?あなたが答えが間違っていれば、答えには何の意味もありません。ボタンには、「あなたの推測を投稿する」または「推測を投稿する」ではなく、「あなたの答えを投稿する」と表示されます。 – dreamlax