在stringByTrimmingCharactersInSet获取泄漏:[NSCharacterSet whitespaceAndNewlineCharacterSet]

时间:2010-06-28 11:45:38

标签: objective-c

我在下面的代码中泄漏:

search.h

NSString *str;

search.m

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

我没有得到如何解决这个问题,任何人都可以帮我解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

你怎么知道这是泄漏? str在您的示例中是自动释放,这意味着它会在返回此方法后释放一段时间。只有当您在没有自动释放池的单独线程上执行此任务或使用自动释放池时,您才会清除,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

不要忘记在此对象的dealloc方法中释放str(为此覆盖dealloc;不要忘记在重写方法中调用[super dealloc]作为最后一条指令。)