【问题标题】:Getting leak at stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]在 stringByTrimmingCharactersInSet 处泄漏:[NSCharacterSet whitespaceAndNewlineCharacterSet]
【发布时间】:2010-06-28 11:45:37
【问题描述】:

我在下面的代码中遇到了泄漏:

搜索.h

NSString *str;

搜索.m

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

我不知道如何解决这个问题,谁能帮我解决这个问题。

提前致谢。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    你怎么知道这是泄漏? 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-15
      • 2015-06-14
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2014-10-21
      • 2010-10-06
      • 2011-12-12
      相关资源
      最近更新 更多