2010-05-19 3 views
5

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

Я думаю, что я создаю 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?

Благодарим за помощь!

+0

Я вижу то же самое - с версией iOS 4.1. Релиз, похоже, не имеет значения, и я попробовал Autorelease вместо этого - то же самое. Это должно быть ошибка в ОС, не так ли? – Axeva

+0

Я вижу то же самое сегодня в iOS 4.1, и спасибо за этот вопрос. – AechoLiu

+0

но как можно решить эту проблему? Я в такой ситуации. после выделения удержания составляет 1; после показания alertView для сохранения остатка 6 после освобождения его остатка сохраняется 5 -> и происходит утечка памяти – 2011-10-08 12:44:17

ответ

6

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

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

0

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

+0

Я склонен согласиться, но мне было просто интересно, был ли я сумасшедшим или если это предполагалось по какой-то странной причине. Благодаря! – Erik

3

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