5

私は iPhone 開発に比較的慣れていないので、これは私のせいかもしれませんが、私が見たものとは逆です。:)

私は、「if」ステートメントのこの真空に住む UIAlertView を作成していると思います。

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if(!data)
{
    // Add an alert
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:@"Unable to contact server"
                                                   delegate:nil
                                          cancelButtonTitle:@"Ok"
                                          otherButtonTitles:nil];
    NSLog(@"retain count before show: %i", alert.retainCount);
    [alert show];
    NSLog(@"retain count before release: %i", alert.retainCount);
    [alert release];
    NSLog(@"retain count after release: %i", alert.retainCount);
    return nil;
}

ただし、コンソール ログは私を困惑させます。

retain count before show: 1
retain count before release: 6
retain count after release: 5

私も追加しようとしました:

alert = nil;

リリース後。これにより、保持カウントは 0 になりますが、それでもリークが表示されます。それが役立つ場合、リークの責任フレームは UIKeyboardInputManagerClassForInputMode です。OS 4 Beta 3 も使用しています。

-show を呼び出すと、ローカルの UIAlertView の保持カウントが 5 ずつ増加する方法を知っている人はいますか?

ご協力いただきありがとうございます!

4

3 に答える 3

6

[alert show] がすぐにアラートを画面に表示しないことに気付いた場合、これはある程度の意味があります。[alert show] がアラートを保持するシステム内のどこかのキューにアラートを追加すると、何が起こるかと思います。 この関数から戻ってイベント ループに戻るまで、実際には表示されません。 最終的に破棄されると、これらの保持カウントが減り、その後解放されます。

didPresentAlertView などの UIAlertView のデリゲート ルーチンからのメッセージをログに記録する場合、アラートを「解放」した後、関数が終了するまでログに記録されないに違いありません。リリースは常に割り当て解除を意味するわけではなく、所有権を放棄するだけです。所有者が残っていない場合にのみ、解放が発生します。

于 2010-05-19T05:18:22.757 に答える
3

これがメモリリークであることは間違いありません。アラート ビューが表示されるだけです。ウィンドウに追加されるなどです。これらはすべて、所有するものを保持します。一度閉鎖されたら、もう存在しないに違いありません。

于 2010-05-19T01:52:51.880 に答える
0

私の推測では、これはベータ SDK に関連していると思われます。ベータ版には多くのエラー/バグがあります。3.1.3 または 3.2 SDK で確認することをお勧めします。

于 2010-05-19T01:50:15.333 に答える