【问题标题】:stringWithString leaking memorystringWithString 泄漏内存
【发布时间】:2011-06-26 18:54:34
【问题描述】:

嗨,我有一个简单的函数,它基本上返回输入字符串的修剪版本。问题是当我运行仪器并检查泄漏时,此函数显示 100% 泄漏,特别是在线 stringWithString 上。

谁能指导我在这里做错了什么。

+ (NSString *) trim:(NSString *)string
{
    if (string == nil)
        return nil;
    NSString *str = [NSString stringWithString:string];
    str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    //[[NSString stringWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]] autorelease];
    return str;
}

【问题讨论】:

  • 你是否保留返回的字符串,因为这个字符串被标记为自动释放

标签: iphone objective-c ios memory-leaks nsstring


【解决方案1】:

如果此代码在线程上运行,请确保您设置了自动释放池。 stringWithString 返回一个自动释放的对象,只有当你的线程有一个自动释放池时才会发生这种情况。

【讨论】:

    【解决方案2】:

    首先,这在我看来绝对没问题,你确定泄漏是与stringWithString: 相关的吗?

    那么,无论如何你都不需要它。你可以这样做:

    + (NSString *) trim:(NSString *)string
    {
        if (string == nil)
            return nil;
    
        return [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    }
    

    【讨论】:

      【解决方案3】:

      我能想到的唯一原因是,如果您从没有 NSAutoReleasePool 的 spawn 线程运行此代码,因为 [NSString stringWithString:string]; 有一个 autorelease 消息发送给它。

      【讨论】:

      • -stringWithString: 不一定会发送自动释放。如果参数不是 NSMutableString,你可能会得到相同的字符串。
      • 嗯,杰里米,你让我更困惑了 :)
      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2013-01-20
      • 2011-10-31
      • 2019-08-10
      • 2013-06-24
      • 2011-03-22
      相关资源
      最近更新 更多