2

自動解放について質問があります。コードは次のとおりです。

int main(int argc, char *argv[]){
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}}

ドキュメントは、 @autoreleasepool{} の最後で、autorelease としてマークされたオブジェクトが解放メッセージを受け取ると述べています。しかし、UIApplicationMain は決して戻りません。つまり、フローが @autoreleasepool の最後に到達することはなく、autorelease としてマークされたオブジェクトは、アプリが終了するまで解放されません。オートリリースの意味はありません.....

私は、iOS システムがいくつかのスレッドを生成すると言う人に尋ねました (1 つのスレッド、1 つの実行ループ)。彼は、実行ループが自動解放プールを作成すると言いました。 . しかし、私たちがメインスレッドを使用するほとんどの状況. だから彼の言うことは私を説得しません.

autorelease を使用する適切な時期はいつですか。長い間混乱していました。

1 つの runloop が終了すると autorelease オブジェクトが解放されるという別のポイントが得られます (メインの runloop はアプリの全期間存在しますか??) ので、よくわかりません..

任意のポイントと関連ドキュメントをいただければ幸いです!!

4

1 に答える 1

5

はい、技術的にはUIApplicationMain決して返されないため、その@autoreleasepoolブロックの終わりに到達することはありません。したがって、この場合、その@autoreleasepoolブロックを削除しても違いはありません(自動解放プールなしで自動解放されたと不平を言うことを除いて)。mainただし、常に呼び出されるとは限らない方法で記述された関数を想像することは可能ですUIApplicationMain(おそらく iOS アプリケーションではそうではありませんが、一般的に)。それは違いを生むでしょう。

すべてのスレッドのエントリ ポイントのボディの周りに常に@autoreleasepoolブロックを配置することは良い習慣mainであり、メイン スレッドのエントリ ポイントです。したがって、一貫性を保つために、常にそこに置くのが理にかなっています。

あなたが話した人が話していることは、内部UIApplicationMainには実行ループ (イベントを処理する無限ループ) があり、各反復内には自動解放プール (またはおそらく数回の反復ごと; 実装の詳細) があるということです。ただし、これは自動解放プールとは関係ありませんmain

于 2013-03-31T04:10:45.097 に答える