2010-07-27 2 views
6

У меня есть контроллер представления, показывающий UITextField. Здесь я привожу клавиатуруОшибка утечки памяти на клавиатуре

- (void)viewDidAppear:(BOOL)animated 
{ 
    [wordTextField becomeFirstResponder]; 
} 

Тогда у меня есть кнопка, которая увольняет клавиатуры, не закрывая сам контроллер:

- (void)cancel:(id)sender 
{ 
    if([wordTextField isFirstResponder]) 
    { 
     [wordTextField resignFirstResponder]; 
    } 

} 

После этого инструменты покажет мне утечки на

# Category Event Type Timestamp RefCt Address Size Responsible Library Responsible Caller 
0 Malloc 128 Bytes Malloc 00:11.239 1 0x3b82550 128 UIKit UIKeyboardInputManagerClassForInputMode 

Где-то в стек [wordTextField resignFirstResponder] упомянутый.

Даже если я сам не привожу клавиатуру и не позволяю пользователю ее запускать, у меня все еще есть утечка. В этом случае нет ничего из моего кода, упомянутого в стеке.

+0

Только для теста я создал новый проект на основе представления с единственным 'UITextField', больше ничего. Нажмите на текстовое поле, чтобы вызвать kbd и вызвать утечку памяти, упомянутую выше. Я использую инструменты 2.1 и Xcode 3.2.2. Должен ли я игнорировать эту утечку? – Pablo

+0

симулятор или устройство? Если его устройство, пожалуйста, разместите образец проекта, которому это интересно. –

+0

Это симулятор, но все равно интересно убедиться. Сегодня будет проверять устройство. Наряду с этим в моем первоначальном проекте у меня есть 2 'open_handle_to_dylib_path', который, насколько я понимаю из-за googling, может быть ложным сигналом тревоги с симулятором. Но ничего не мог найти о 'UIKeyboardInputManagerClassForInputMode', поэтому может быть что-то серьезное. – Pablo

ответ

7

The Leaks Instrument показывает вам память, которая не будет бесплатной в обычном ходе приложения (потому что на ней нет ссылок). Это само по себе не biggie, он будет свободен, когда приложение выйдет. Большая часть кода рамки будет выделять и оставлять эти очень маленькие куски выделенной памяти. Я понятия не имею, являются ли они ошибками или важны для работы приложения. Как бы то ни было, мы должны признать, что они полностью нормальные.

Утечки будут идентифицировать эти куски памяти как «Утечки», и это звучит плохо, но на самом деле это не «утечки», которые инструмент помогает вам идентифицировать.

«Настоящие» утечки находятся в коде, который может выполняться много раз и выделяет некоторую память, которая никогда не освобождается, поэтому со временем будет потребляться все больше и больше памяти, пока не будет использована вся память, и ваше приложение будет аварийно завершено.

Итак, если у вас есть приложение, независимо от того, как долго вы его используете, или независимо от того, как вы его используете, он «утечки» 128 байтов в фреймворке Apple, который вам вообще не нужно беспокоиться.

Однако, если у вас есть приложение, которое говорит, что каждый раз, когда вы нажимаете кнопку, он выделяет новую строку, которая никогда не выпускается - независимо от того, сколько байтов в строке - если пользователь нажал кнопку достаточно, это будет потреблять всю память, доступную для приложения, и, в конечном счете, сбой. Это утечка, о которой нужно следить.

Инструмент утечки реалистично не может определить разницу между двумя видами, но вы должны уметь. Например, вам может понадобиться какой-то одноэлементный объект, например, что существует только один экземпляр, который должен существовать на протяжении всего срока службы вашего приложения. Вы создаете объект при запуске приложения, и вам реально не нужно освобождать этот объект, его можно убить, когда приложение выйдет. Утечки будут обозначать это как утечку, а некоторые другие разработчики, с которыми вы работаете, которые предполагают, что это означает, что вы не знаете, что вы делаете, будут бежать к вашему боссу, как маленький ребенок, и сказать: «Он пишет действительно пропущенный код, и это Reeeeally плохо ". И ваш босс, который не является программистом, воспримет его всерьез, потому что он звучит плохо, и в любом случае он соскабливал 2,2 в CS от авторитетного университета, поэтому он должен знать, о чем он говорит. Когда действительно это вполне разумно и точно, что вы хотели сделать.

Итак, используйте инструмент «Утечки», чтобы найти ошибки в коде, которые разрушат ваше приложение. Не беспокойтесь о каждом байте, найденном «Leaking» в каркасе Apple.

+0

@iPhoneDev: Спасибо. BTW, на устройстве не было такой утечки, производимой в «Инструменты». – Pablo

Смежные вопросы