2011-02-09 11 views
9
#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

メインメソッドは、アプリケーションの終了後にプール上でreleaseを呼び出します。これは、プール内のすべてのオブジェクトにreleaseを送信します。しかし、アプリケーション内で作成された自動リリースされたオブジェクトは、アプリケーションが終了するまで、実行ループの途中で固執しないので、プールは排水されるか解放されます(iPhoneのコンテキストでは、この時点で修正されました!)。しかし、これが起こったときに誰かが確かに知っていますか?ランロップの終わりにプールが流出し、次のプールの始めに新しいプールが割り当てられるのは理にかなっているようですが、これに関する決定的な情報はありません。アップルのフォーラムにはHere's a discussionがありますが、それは非常に投機的です(最終的には議論の余地はありません)。 ドキュメントやソースコード(あるいは実験的なプログラム)からの証拠があれば誰でも私に答えられますか?Cocoa-touchの主なオートリリースプールはいつ排水されますか?

+0

参照する特定のプールは、アプリケーションの最後まで排水されませんが、実行ループを呼び出すたびに、アプリケーションの実行ループにネストされた独自のプールが作成されます。 – cobbal

+0

これは意味があります。だから、自分のプールを決して作成しないと、あるアプリケーションはデフォルトで2つのネストされたプールを持っていますか? – jakev

+0

Yup;実行ループ内の外側プールおよびサイクリングプールを含む。 UIApplicationMain()は実装の詳細としてプールを作成/排除する可能性があります。 – bbum

答えて

11

NSAutoreleasePool Class Referenceから:アプリケーションキットは、それによって処理中に生成された自動解放オブジェクトを解放し、自動解放イベントループの各サイクルの開始時にメインスレッド上のプール、および終了時にドレインを作成

イベント。

+0

どのように私はそれをお見逃しですか?ありがとう... – jakev

+0

疑問があった場合は、NSAutoreleasePoolのドキュメントのOS XバージョンとiOSバージョンの両方にこのステートメントが含まれているので、明らかに両方のプラットフォームに当てはまります。 – Sandy

関連する問題