【问题标题】:How am I leaking NSString in this case?在这种情况下,我如何泄漏 NSString?
【发布时间】:2011-09-22 20:58:37
【问题描述】:

我有一个表格视图,在最后一行有一个字符串。

@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
    NSString *loadingMessage;   
}
@property (retain) NSString *loadingMessage;
@synthesize loadingMessage;

- (UITableViewCell *)tableView:(UITableView *)pTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//some stuff...
        cell.textLabel.text = loadingMessage;
}

然后当某些事件发生时,我将更改加载消息:

-(void)requestFailed:(NSError*)error {
    self.loadingMessage = [NSString stringWithFormat:@"Failed with error: %@", error];
}

根据仪器,我在这里泄漏了 loadingMessage 字符串......但我不明白为什么。我认为 stringWithFormat 的计数是 +0,而 setter 是 +1。当我解除分配时,我也会释放字符串。我做错了什么?

【问题讨论】:

  • 据我所知,没有任何问题。你是在一个独立的测试中做这个测试,还是在一个其他 NSString 可能有问题的程序中做这个测试?
  • 不是独立测试,但这是仪器报告泄漏的唯一 ivar...
  • 显示使用和设置 loadingMessage 的代码。另外,你是在 dealloc 中释放的吗?
  • 我给你看了对吧?我在 cellForRowAtIndexPath 中使用它并在 requestFailed 中设置它。我确实提到我在 dealloc 中发布了它。

标签: iphone nsstring instruments memory-leaks


【解决方案1】:

您发布的代码是正确的。实际上,stringWithFormat 返回一个自动释放的对象,因此您可以直接将其分配给保留属性。

所以,要么你在你的代码中做一些其他的分配,或者,更有可能的是,你没有在你的dealloc 中释放loadingMessage

只是一个假设。

【讨论】:

    【解决方案2】:

    Sergio 是对的,代码没有问题,但我发现字符串属性需要复制而不是保留。

    试试

    @property (copy,readwrite) NSString *loadingMessage;

    可能会阻止泄漏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      相关资源
      最近更新 更多