【问题标题】:Performance tool - leak性能工具——泄漏
【发布时间】:2011-11-26 01:06:22
【问题描述】:

如果我使用性能工具测试我的代码 - 泄漏,它不会检测到任何泄漏。这是否意味着代码没有泄漏任何内存?

我有一部越狱的 iPhone,我可以监控它的可用内存。如果有人知道,那就是 SBSettings。我测试了我的应用程序,它有一个 UITableView,当我滚动 tableView 时,我可以看到可用内存下降。从 300MB 到 30MB,似乎不能再下降了。它通常不会与游戏以外的其他应用程序一起下降太多。我正在使用带有 2 个按钮、1 个 textView 和 3 个 UILabel 的自定义 UITableViewCell。

所以,是的。如果性能工具没有检测到任何泄漏,我安全吗?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"StatusTableCell";

    StatusTableCell *cell = (StatusTableCell *)
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle]
                                    loadNibNamed:@"StatusTableCell"
                                    owner:nil options:nil];
        for (id currentObjects in topLevelObjects){
            if ([currentObjects isKindOfClass:[StatusTableCell class]]){
                cell = (StatusTableCell *) currentObjects;
                break;
            }
        } 
        [cell.cancelButton addTarget:self action:@selector(cancelButton:) forControlEvents:UIControlEventTouchUpInside];
    }
     /// some other stuff
     return cell;
}

【问题讨论】:

标签: ios xcode jailbreak


【解决方案1】:

您应该考虑性能工具中 LiveBytes 的值,如果它随着应用程序的运行而增加,这是一个问题。如果您不使用可重复使用的单元格,则表格视图可能会发生这种情况。如果您有可重复使用的单元格,请检查它。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reusablecell"];

    if(!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reusablecell"];
        [cell autorelease];

    }
//update cell here

return cell;
}

【讨论】:

  • 我可以看到,当我滚动 tableView 时,Live Bytes 确实在不断增加。这很奇怪,因为我重用了我的问题上发布的单元格。
  • 很可能,您没有在“cellForRowAtIndexpath”中使用可重复使用的单元格,请参阅我的帖子中更新的示例代码。
  • 我已经通过在 else 语句中添加 NSLog 进行了验证,是的,我正在重新使用单元格。 if(cell == nil) 只被调用了两次,其余时间不为零。
  • 哦,nvm,我为 UITableViewCell 设置的标识符名称与它的类相同。更改为其他标识符名称后没有任何问题。
  • 太好了..它对你有用..但很奇怪!但是这个解决方案在很多情况下都有效......!!
【解决方案2】:

不,你不一定安全。

当程序不再引用某个对象时,就会发生内存泄漏。因此,如果一个对象被释放,但它保留的一个对象没有被释放(例如,在 dealloc 方法中没有正确释放),就会发生泄漏。

但是,如果拥有对象本身从未被释放,则不会检测到泄漏。

要查找此类内存问题,请运行分配工具工具。单击 Mark Heap 按钮,然后在应用程序中执行某种可重复的操作(例如,在表格视图中选择一行以将详细视图推送到导航堆栈,然后点击返回按钮)。再次单击标记堆按钮。然后重复这个动作几次。理想情况下,您应该不会看到堆增长,并且堆镜头之间没有持久对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多