UIAlertView - шоу, вызывающее утечку памяти - PullRequest
5 голосов
/ 19 мая 2010

Я относительно новичок в iPhone Development, так что это может быть моя вина, но это противоречит тому, что я видел. :)

Я думаю, что я создаю UIAlertView, который живет как раз в этом вакууме оператора if.

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.

Так что у кого-нибудь есть идеи, как счетчик сохранений локального UIAlertView увеличится на 5 при вызове -show?

Спасибо за вашу помощь!

Ответы [ 3 ]

6 голосов
/ 19 мая 2010

Это имеет некоторый смысл, если вы понимаете, что [оповещение] не сразу выводит оповещение на экран. Я думаю, что происходит то, что [оповещение] добавляет оповещение в некоторую очередь где-то в системе, которая его сохраняет. На самом деле он не будет отображаться, пока вы не вернетесь из этой функции и не вернетесь в цикл обработки событий. Когда он в конечном итоге будет отклонен, количество сохраняемых данных будет уменьшено и затем будет освобождено.

Если вы будете регистрировать сообщения от подпрограмм делегата UIAlertView, таких как didPresentAlertView, я держу пари, что это произойдет только после завершения вашей функции, после того как вы «отпустили» предупреждение. Освобождение не всегда означает освобождение, это просто отказ от права собственности. Вызывает сделку, только если не осталось владельцев.

3 голосов
/ 19 мая 2010

Я очень сомневаюсь, что это утечка памяти. Отображается только предупреждение: оно добавляется в окно и т. Д., И все они сохраняют то, что им принадлежит. Могу поспорить, что если вы проверите, когда он будет закрыт, он больше не будет существовать.

0 голосов
/ 19 мая 2010

Полагаю, это связано с бета-версией SDK. Есть много ошибок / ошибок в бета-версиях. Я бы предложил проверить его с помощью SDK 3.1.3 или 3.2.

...