在iPhone上使用ARC超过200 MB的实时字节增长

时间:2014-01-31 16:02:59

标签: objective-c ios7 automatic-ref-counting

当我使用乐器运行我的iPhone应用程序时,它会显示当我来回显示模态视图控制器时的实时字节增长,但即使使用超过200 MB的应用程序也不会被杀死。

这到底发生了什么?我消耗了大量的内存? 顺便说一句,我正在使用带有ARC的iOS 7。

下图显示了实时字节。 Instruments

谢谢。

更新: 我的模态视图控制器中的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ActionCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    Action *action = self.actions[indexPath.section][indexPath.row];
    cell.textLabel.text = action.title;
    cell.textLabel.textColor = self.sectionColors[indexPath.section];

    CustomCellBackgroundView *customCellBackgroundView = [[CustomCellBackgroundView alloc] init];
    customCellBackgroundView.borderColor = self.sectionColors[indexPath.section];
    customCellBackgroundView.fillColor = [self.sectionColors[indexPath.section] colorWithAlphaComponent:0];

    if ([self.actions[indexPath.section] count] == 1) {
        customCellBackgroundView.position = CustomCellBackgroundViewPositionSingle;
    } else if (indexPath.row == 0) {
        customCellBackgroundView.position = CustomCellBackgroundViewPositionTop;
    } else if (indexPath.row == [self.actions[indexPath.section] count] - 1) {
        customCellBackgroundView.position = CustomCellBackgroundViewPositionBottom;
    } else {
        customCellBackgroundView.position = CustomCellBackgroundViewPositionMiddle;
    }

    cell.backgroundView = customCellBackgroundView;

    return cell;
}

模态视图控制器将弱委托保存到调用模态的主视图控制器。 并且没有[self.presentedViewController dismissViewControllerAnimated:YES completion:NULL];发布模态视图控制器的好(及其所有子视图和变量)?

顺便说一句,CustomCellBackgroundView可能不是问题,因为我有另一个模态视图控制器以相同的方式使用它,但不会增加内存使用量。

奇怪的是,即使使用了200 MB,应用程序也没有被杀死,为什么(不在模拟器上运行,在实际的iPhone上运行)?

2 个答案:

答案 0 :(得分:0)

这是一个花了我一些时间来理解的问题,但即使方舟很神奇,也有助于分配!您不能编写复杂的应用程序代码,并在没有您的帮助的情况下抛弃所有数据管理以供ARK处理。

每个viewController,你必须有一个“ViewWillDissapear”方法,在那里,你需要将你使用的每个对象都变为nil,所以ARK知道它可以摆脱它。

//重要 如果你在你的应用程序中使用图像,那么通过将它们变为零来释放它们非常重要。 如果你使用任何上下文,你必须手动释放! 在岸上,你不是要保持每个以太之上的曼尼观点! 如果您使用音频文件,则必须在以后发布!

最后一点,请确保您没有对不需要强引用的对象进行“强”引用。因为他们永远不会被释放。

希望这有帮助, 快乐的编程。

答案 1 :(得分:0)

我很抱歉这个愚蠢的问题,这是一个新手的错误,问题是我通过调用存储在我的视图控制器中的块内的self方法来创建一个保留周期。