0

これは、で指定されているセレクターの本体です。NSThread +detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    ながら (やる)
    {
        もし (doItForSure)
        {
            NSLog(@"チェック");
            doItForSure = NO;

            (void)gettimeofday(&start, NULL);

            /*
                何かをする */

            // 次の行は "_NSAutoreleaseNoPool():" メッセージをログに出力します
            CGImageRef screenImage = UIGetScreenImage();


            /*
                他のことをする */

            (void)gettimeofday(&end, NULL);

            経過 = ((double)(end.tv_sec) + (double)(end.tv_usec) / 1000000) - ((double)(start.tv_sec) + (double)(start.tv_usec) / 1000000);

            NSLog(@"経過時間: %e", 経過);

            [プールドレイン];
        }
    }

    [プール解放];

自動解放プールが存在する場合でも、次のように呼び出すと、これがログに出力されますUIGetScreenImage()

2010-05-03 11:39:04.588 ProjectName[763:5903] *** _NSAutoreleaseNoPool(): クラス NSCFNumber のオブジェクト 0x15a2e0 がプールなしで自動解放されました - ちょうどリークしています

他の誰かがUIGetScreenImage()別のスレッドでこれを見たことがありますか?

4

1 に答える 1

0

[pool drain]iOS では と同じように動作し[pool release]ます。そのため、while ループの最初の反復の後、自動解放プールが配置されないことになります。を削除drainすれば問題ありません。ただし、メインスレッド以外のスレッドで UIGetScreenImage() を使用してもよいかどうかはわかりません。

于 2010-11-23T11:15:48.540 に答える