すべてのObjective-Cの開始ページでは、main関数の宣言の下のデフォルト@autoreleasepool{...}
文で開きます。しかし、この声明は実際に何をしていますか?新しいObjective-Cはオブジェクトを自動的に解放し、行を削除するとプログラムに何も変わりません。このコマンドは本当に必要ですか?
答えて
@autoreleasepool
ステートメントは、NSAutoreleasePoolクラスを使用する代わりに、以前と同じジョブを実行しています。 NSAutoreleasePoolが動作する方法は、それを作成するとアプリケーション全体に影響を及ぼしたので、ちょっと変わったものでした。 @autoreleasepool
はスコープされた領域を作成し、プール内のものと排水時(範囲外になったとき)を明確にします。アップルによれば、これはさらに効率的です。
自動解放プールの概念は、オブジェクトインスタンスが自動解放としてマークされると(例えば、NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];
)、その実行時に+ 1の保持カウントを持ちますが、実行ループの終わりプールが排水され、autoreleaseとマークされたオブジェクトの保持カウントが減少します。それは、それ自体のためにそれを保持するものを準備する間に、オブジェクトを保持する方法です。
ARCを使用すると、開発者はautorelease
キーワードを使用しませんが、ARCを管理する基盤となるシステムによってARCが挿入されます。 (覚えていること: ARCが行っているのは、retain
、release
、autorelease
が適切なタイミングであなたに呼び出されていることです)。このため、既存のAutoreleasePoolのコンセプトはそのまま残す必要があります。あなたが自動解放プールを削除する場合は、あなたのオブジェクトが参照カウント環境では
漏れるのを開始します
は、ココアは、自動解放プールは常に利用可能であるように期待しています。プールが利用できない場合、自動リリースされたオブジェクトは解放されず、メモリがリークします。この状況では、プログラムは通常、適切な警告メッセージを記録します。
これがあればということを意味してい私はARCを使用し、 '' @autoreleasepool {} 'の外側のオブジェクトを解放します。オブジェクトは@autoreleasepoolブロックの終わりまで存在しますか? – confile
自動解放されたオブジェクトを手動で解放すると、自動解放プールの最後に到達すると、deallocされたオブジェクトは存在しなくなり、フレームワークやマシンコードのどこかの例外が発生します。それはコードの長い道のりである場合、あなたのアプリは混乱を引き起こして一見無関係な場所でクラッシュするように見えるかもしれません。 – jcpennypincher
- 1. トランスフォームとは何か、トランスフォームとは何ですか?
- 2. jobConfクラスとは何ですか?それは何ですか?
- 3. @privateとは何ですか?その用途は何ですか?
- 4. IPM.Noteとは何ですか?その用途は何ですか?
- 5. _applyプラグインとは何ですか: 'com.google.gms.google-services'_は何ですか?
- 6. Mongoclientとは何ですか?その目的は何ですか?
- 7. 型とは何ですか?スカラーの型コンストラクタは何ですか?
- 8. GraphemeClusterとは何ですか?ExpressibleByExtendedGraphemeClusterLiteralの機能は何ですか?
- 9. オプションとは何ですか?typescriptの[x:string]は何ですか?
- 10. Sqliteとは何ですか?
- 11. イメージハッシュとは何ですか?
- 12. (* new)とは何ですか?
- 13. WCF:ServiceHostとは何ですか?
- 14. __gmon_start__シンボルとは何ですか?
- 15. Control.IsHandleCreatedとは何ですか?
- 16. ADBとは何ですか?
- 17. `+:`と ` - :`は何ですか?
- 18. sun.jnu.encodingとは何ですか?
- 19. シャドウメモリとは何ですか?
- 20. os.geteuid()とは何ですか?
- 21. RFC3986とは何ですか?
- 22. シリアライゼーションプロキシパターンとは何ですか?
- 23. onPrepareOptionsMenuとは何ですか?
- 24. BOOST_ROOTとは何ですか?
- 25. WCFとは何ですか?
- 26. _CDSnapshot_EntityNameとは何ですか?
- 27. ViewControllerとは何ですか?
- 28. REQUEST_CHECK_SETTINGとは何ですか?
- 29. msstdfmt.dllとは何ですか?
- 30. キャッシュタグディレクトリとは何ですか?
それともhttp://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –