我正在开发一个应用程序,我正在努力理解为什么Xcode似乎在告诉我它几乎所有创建的东西都在坚持(看起来似乎),每隔一段时间就会产生一些内存压力。
到目前为止,我非常简单地展示了我的所有观点,信息等。我有2 ViewController
个,一个在发布时出现,另一个登录被认为成功。
所呈现的其余信息由我创建的各种子类(大多数是UIView
,UILabel
或UIButton
的子类)处理。
我经常使用的一个类称为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。
似乎无论出于何种原因我的应用程序继续创建MailView而不会破坏它们。
我的问题是(感谢留在我身边),在阅读我的内存使用情况时,这是否与Xcode和/或Instruments有关?或者这是应用程序的内部问题。我知道我可能需要提供更多以获得最佳答案,但从我所展示的内容和解释中,每个视图只是一个被添加到视图层次结构中的UIView,然后它被删除(随后&#34;杀死&#34;在视图下链接的任何子视图)。
这里有很多关于类似问题的帖子,但很多帖子都在暗示我正在做什么(removeFromSuperview,= nil(我试过),使用Instruments,手动dealloc,虽然我使用ARC)。
如果有人想到我失踪的东西,或者根本不知道,我会非常感谢你让我知道。感谢
据我所知,iOS设备似乎基本上都能保留它所能做的一切,除非A)认为你不再需要它(很可能是超时)或B)存在内存压力,所以它摆脱了最不重要的&#34;项目。但同样,情况似乎并非如此,因为我从这些问题中得到了记忆警告。
(我今天刚刚更新到8.2.1,所以我现在可以通过Xcode中的DMG看到回溯(在方案中启用了Malloc),而不是必须通过仪器)
以下是选择一个的MailView
项目时的结构片段。这是在我打开和关闭邮件2次之后,因此它保留了2个视图。这就是我需要解决的问题。
以下是多次打开和关闭邮件视图的另一次运行内存图表的剪辑。
答案 0 :(得分:1)
嗯..似乎尽管我尽最大努力摧毁了任何自定义“视图”,但在破坏保留这些“视图”的对象时,这肯定是非常无效的,这些视图将继续在应用程序中克隆和复制VM运行时。
特别是,罪魁祸首不是NSArray
。对于正在创建的每个视图,生成并存储了一个简单的数组CUCells *cells
视图子视图(单元格)。我最初设计的子类是对它的父级的强引用,但需要将其更改为每次“打开”时独立创建。完成此更改后,每次打开视图时都会初始化cells
并分配[cell removeFromSuperview]
,并且无法与cells = nil
一起销毁。
ImageView
等等,其他“强”引用允许应用程序正确销毁与先前销毁的视图的所有关系。