2
#import <UIKit/UIKit.h>

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

その場合、すべてのイベントで main() 関数を呼び出す必要がありますよね? しかし、試してみたところ、アプリの起動時に「新しいイベント...」というログメッセージが表示されます。したがって、メインスレッドには別の自動解放プールが必要だと思います。

4

2 に答える 2

5

いいえ。すべての Cocoa または CocoaTouch クラスには、メモリ リークを防ぐために自動解放プールが必要です。したがって、UIApplicationMain() のコンテキストでインスタンス化された (場合によっては) 自動解放されたオブジェクトをカバーするには、既存の自動解放プールが UIApplicationMain() を呼び出す必要があります。この外側の自動解放プールは、UIApplicationMain が返された後、アプリケーションが終了する直前に排出されることがわかります。アプリケーションの実行ループの各反復の開始時に内部 (自動解放プールをネストでき、自動解放されたオブジェクトが最も新しい/最も深いプールに追加されることに注意してください) 自動解放プールが作成され、反復の最後に解放されます。したがって、実行ループの各反復は、「独自の」自動解放プールを取得します。イベントの処理によって大量の自動解放メモリが生成される可能性がある場合 (iPhone では悪い考えです。

于 2009-04-28T17:31:40.953 に答える
1

いいえ、これはアプリケーションの最も外側の関数であり、通常の C スタイルの main() です。

すべてのイベント処理を含め、iPhone アプリが行うすべてのことは UIApplicationMain で行われます。

于 2009-04-28T17:16:50.410 に答える