2010-11-25 4 views
0

メモリ管理に関して何か不足していると思います。コードは次のとおりです:リリースされたオブジェクトでメソッドを呼び出す

NSString *string = @"foo"; 
[string release]; 
NSLog(@"%@", string); 

私はそのコードでメモリエラーが発生すると予想しますが、コードはエラーなしで実行されます。これは私が本を辿っているのに気づき、プロパティを設定してサブビューを追加する前(しかしメインビューに挿入した後)にscrollViewがリリースされました。

私の質問は、オブジェクトが実際に割り当て解除されるのはいつですか?これは良いコーディングスタイルと考えられますか?

答えて

3

オブジェクトを割り当て、保持またはコピーする場合は、オブジェクトを解放するのはあなたの責任です。他のすべてはシステムによって処理され、自動解放プールでフラッシュされます。

SOすでにオンにあまりにも多くのメモリ管理の質問は、[編集] おそらく、あなたが理解する必要があなたの質問の最も重要な部分は、あなたの中にある自分自身を取得するために周りの迅速な外観はhttps://stackoverflow.com/search?q=memory+management+iphone

を熟知している、があります最後の2番目の段落:

このコードは表示されていませんが、UIViewインスタンスにscrollViewを追加した可能性があります。このような場合、受信ビューは常にサブビューを保持しているので、自由に解放することができます。

UIViewインスタンスがリリースされると、scrollViewを含むすべてのサブビューにリリースメッセージが送信されます。

意味がありますか?

+0

はい、実際には、スクロールビューのコンテキスト内でどのように動作するかを理解しました。ありがとう。 –

5

これは、string変数がアプリケーションにコンパイルされた定数文字列を指しているために機能します。 retainは何もしません。また、何もしません。これは静的メモリ内に存在し、プログラムがメモリからアンロードされるときにのみ破棄されます。

3

解放されたオブジェクトへのメッセージの送信は、未定義の動作です。メモリエラーが発生したり、別のオブジェクトにメッセージを送信したりする可能性があります。元のオブジェクトのファンタムバージョンにメッセージを送信する可能性があります。実行時の環境の詳細や実装の詳細あなたのコントロールの外に。この特定のケースでは、NSString定数が永続的である実装の詳細を実行しています。

特に、オブジェクトの割り当てを解除するときは、実装の詳細です。オブジェクトを所有しておらず、周囲にまだ存在するという合理的な保証がない場合(例えば、[someArrayYouOwn objectAtIndex:0]を実行して取得した)、そのオブジェクトを扱ってはいけません。

最高のポリシー:自分が所有していないオブジェクトにメッセージを送信しないでください。メモリ管理ルールに従います。

関連する問題