奇怪的ARC内存发布问题

时间:2016-12-22 05:50:10

标签: ios objective-c xcode memory automatic-ref-counting

我正在开发一个应用程序,我正在努力理解为什么Xcode似乎在告诉我它几乎所有创建的东西都在坚持(看起来似乎),每隔一段时间就会产生一些内存压力。

到目前为止,我非常简单地展示了我的所有观点,信息等。我有2 ViewController个,一个在发布时出现,另一个登录被认为成功。

所呈现的其余信息由我创建的各种子类(大多数是UIViewUILabelUIButton的子类)处理。

我经常使用的一个类称为MenuView,它实际上是一个创建菜单的类。

- (MenuView *)createMenuWithFrame:<FRAME> size:<SIZE> type:<TYPE> view:<VIEW>{
    MenuView *menu = [MenuView alloc] initWithFrame:<FRAME>];
    /// Code for creating a UIView with a background image for a menu.
    ...
    /// Done. Now the menu gets added to the passed view <VIEW>. 
    return menu;
}

我的问题似乎在我提出的每个视图中都是持久的,实际上现在每个添加到层次结构(显示)的视图都是MenuView,或使用菜单。

示例

我通过调用初始化子类来简单地呈现视图。

让我的设置视图子类SettingsView作为示例。

HomeViewController.m ,如上所述,查看控制器#2。

#pragma mark Settings
- (IBAction)openSettings:(id)sender {
    [SettingsView createSettingsViewForView:self.view];
}

SettingsView.m 即可。 注意:在我的 MenuView.m 类中,我将创建的菜单添加到我传递给它的UIView

#import "SettingsView.h"

UIView *screenView;

@implementation SettingsView  // a UIView subclass type in interface (.h)

#pragma mark - Create View
+ (void)createSettingsViewForView:(UIView *)view {
    // Here I create a MenuView. This method is just a wrapper of 
    // the menu class. It doesn't create a SettingsView, but rather 
    // creates another MenuView *menu.

    // The menu is given some content, then "shown" (alpha 0 -> 1) 
    // through the MenuView class by using [menu animateMenu:menu];
}

据我所知,经常使用图片会非常昂贵&#34;在内存分配方面,但我很确定如果处理正确,它仍然应该被释放(从已用内存中删除)。在我的情况下,我以为我正确处理它,仍然这么认为..

关闭 ANY MenuView项后,我会在菜单中设置动画(alpha)动画,然后在完成动画后,我会从超级视图中删除菜单。

- (void)closeMenuView:(UIButton *)closeButton {
    MenuView *menu = (MenuView *)closeButton.superview;
    [UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAllowUserInteraction animations:^{
        <CUSTOM TRANSITION OUT OF VIEW>
    } completion:^(BOOL finished) {
        [menu removeFromSuperview];
    }];
}

问题

当我从 HomeViewController.m 中显示设置视图时,我的内存(已经高于我想要的)突然显示 ~10 MB 。 我知道根据屏幕尺寸/ res优化图像大小会大大减少一些内存使用量,但这与我遇到的问题无关。

一旦添加了 ~10 MB ,只需说出 88 MB到98 MB ,关闭菜单对我们来说没有任何影响Xcode中。

使用乐器,我发现打开菜单,然后关闭菜单WILL实际上使用了更低的持久性内存,这也应该是什么( ~11 MB + 1.5 MB设置时开

另一个令人不安的问题让我怀疑我的方法是去除&#34;视图,就是当我呈现并删除一个更大(更复杂)的菜单时,一个被称为MailView,每次视图打开时内存都会爬升#34;但是从不释放任何内存,所以它继续增长。仪器告诉我没有内存泄漏,但显然存在保留此内存的问题。

以下是通过乐器录制的屏幕截图。这可以从“详细信息 - &gt;中找到。统计 - &gt;分配摘要(搜索&#34;邮件&#34;) - &gt; MailView。

enter image description here

似乎无论出于何种原因我的应用程序继续创建MailView而不会破坏它们。

问题

我的问题是(感谢留在我身边),在阅读我的内存使用情况时,这是否与Xcode和/或Instruments有关?或者这是应用程序的内部问题。我知道我可能需要提供更多以获得最佳答案,但从我所展示的内容和解释中,每个视图只是一个被添加到视图层次结构中的UIView,然后它被删除(随后&#34;杀死&#34;在视图下链接的任何子视图)。

这里有很多关于类似问题的帖子,但很多帖子都在暗示我正在做什么(removeFromSuperview,= nil(我试过),使用Instruments,手动dealloc,虽然我使用ARC)。

如果有人想到我失踪的东西,或者根本不知道,我会非常感谢你让我知道。感谢

FYI

据我所知,iOS设备似乎基本上都能保留它所能做的一切,除非A)认为你不再需要它(很可能是超时)或B)存在内存压力,所以它摆脱了最不重要的&#34;项目。但同样,情况似乎并非如此,因为我从这些问题中得到了记忆警告。

更新:

(我今天刚刚更新到8.2.1,所以我现在可以通过Xcode中的DMG看到回溯(在方案中启用了Malloc),而不是必须通过仪器)

以下是选择一个MailView项目时的结构片段。这是在我打开和关闭邮件2次之后,因此它保留了2个视图。这就是我需要解决的问题。

enter image description here

以下是多次打开和关闭邮件视图的另一次运行内存图表的剪辑。

enter image description here

1 个答案:

答案 0 :(得分:1)

嗯..似乎尽管我尽最大努力摧毁了任何自定义“视图”,但在破坏保留这些“视图”的对象时,这肯定是非常无效的,这些视图将继续在应用程序中克隆和复制VM运行时。

特别是,罪魁祸首不是NSArray。对于正在创建的每个视图,生成并存储了一个简单的数组CUCells *cells视图子视图(单元格)。我最初设计的子类是对它的父级的强引用,但需要将其更改为每次“打开”时独立创建。完成此更改后,每次打开视图时都会初始化cells并分配[cell removeFromSuperview],并且无法与cells = nil一起销毁。

  • 此方法的简单覆盖以及ImageView等等,其他“强”引用允许应用程序正确销毁与先前销毁的视图的所有关系。