Получение утечки в stringByTrimmingCharactersInSet: [NSCharacterSet пробелAndNewlineCharacterSet] - PullRequest
1 голос
/ 28 июня 2010

Я получаю утечку по приведенному ниже коду:

search.h

NSString *str;

search.m

-(void)searchMethod:(UISearchBar *)aSearchBar
{
     /*******Showing leak at below line *************/
     str=[aSearchBar.text stringByTrimmingCharactersInSet:
                   [NSCharacterSet whitespaceAndNewlineCharacterSet]];
 }

Я не понимаю, как решить эту банкулюбой поможет мне решить эту проблему.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 июня 2010

Откуда ты знаешь, что это утечка?str является autorelease в вашем примере, это означает, что он освободится через некоторое время после возврата этого метода.Только если вы выполняете эту задачу в отдельном потоке без установленного пула автоматического выпуска или с автоматическим пулом выпуска, который вы никогда не очистите, str может утечь.Если этот код выполняется в основном потоке, str наверняка не утечет.

Я скорее думаю, что вы получите сбой, потому что вы не сохраняете str.Вы сохраняете str в глобальной переменной, но не увеличивая количество сохраняемых данных.Это означает, что после автоматического освобождения str переменная grobal указывает на недопустимую память.Чтобы убедиться, что объект остается живым вне области метода, вы должны сохранить его (если вы не создали этот объект с помощью alloc / init ..., new ... или copy ...).

str = [aSearchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
str = [str retain]; // Keep object alive beyond the scope of this method

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

[str release];
str = [aSearchBar.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
str = [str retain]; // Keep object alive beyond the scope of this method

Не забудьте также освободить str в методе dealloc этого объекта (для этого переопределять dealloc;не забудьте вызвать [super dealloc] в переопределенном методе как последнюю инструкцию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...