Откуда ты знаешь, что это утечка?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]
в переопределенном методе как последнюю инструкцию).