提前感谢您的时间!
适用于iOS 7+应用程序的Xcode版本5.1.1,启用了ARC。
我正在研究在不使用UINavigationController或UITabBarController的情况下在多个UIViewControllers之间切换的最佳模式;关于内存分配和释放最好。我远离导航和标签栏,因为他们使用自己的导航对象并占据屏幕上的空间。
为了测试我做了两个测试项目。有两个UIViewControllers,两个UIButtons和两个UILabels ......
1)使用由CTRL设置的触发segue-将UIButton拖动到下一个UIViewController并选择" modal"。返回时,UIButton的Touch Up Inside IBAction用于关闭第二个UIViewController,即
- (IBAction)pressedButtonGoToTwo:(UIButton *)sender
{
[self dismissViewControllerAnimated:true completion:nil];
}
2)使用本SO帖子中描述的过渡视图控制器:Animate change of view controllers without using navigation controller stack, subviews or modal controllers?(感谢所有贡献者)。要转到第二个UIViewController,使用UIButton的Touch Up Inside IBAction,即
- (IBAction)pressedButtonGoToOne:(UIButton *)sender
{
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
TBAViewController *vc2 = [mainStoryBoard instantiateViewControllerWithIdentifier:@"TBAViewController2"];
TBAAppDelegate *tbaAppDelegate = [UIApplication sharedApplication].delegate;
[tbaAppDelegate.transitionController transitionToViewController:vc2 withOptions:UIViewAnimationOptionTransitionFlipFromBottom];
}
要返回,在第二个UIViewController上使用UIButton的Touch Up Inside IBAction,即
- (IBAction)pressedButtonGoToOne:(UIButton *)sender
{
UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
TBAViewController2 *vc1 = [mainStoryBoard instantiateViewControllerWithIdentifier:@"TBAViewController"];
TBAAppDelegate *tbaAppDelegate = [UIApplication sharedApplication].delegate;
[tbaAppDelegate.transitionController transitionToViewController:vc1 withOptions:UIViewAnimationOptionTransitionFlipFromBottom];
}
在项目中定义了TransitionController UIViewController类型类。
-
我知道有无数种方法可以做到这一点,例如:展开UIViewController。但这些是我最熟悉的两种方式。
使用仪器分配分析,使用实际的iPhone 4(非模拟器)制作以下内存分配和发布配置文件。
1)从第一个UIViewController到第二个UIViewController的12次转换后,记录到11.96kB的净变化。
2)在从第一个到第二个UIViewController的6个转换之后注意到54.66kB的净变化(实现在发布时只有6个,因为在切换到第二个UIViewController之后,释放了第一个分配的内存)
-
我对这些图的解释是两种方法都运行得相当好,但是它们都没有导致净零内存分配变化。
(1)显示第一个UIViewController总是被分配,第二个UIViewController被分配和解散。
(2)表明,为第一个或第二个UIViewControllers之间的每个转换分配了过渡UIViewController。然而,无论何时分配过渡UIViewController都被解除,即内存配置文件看起来像升级并立即停止,而不是像(1)中那样,升级持续到第二个UIViewController被解除。
测试是在实际的iPhone上进行的,因此未在图上捕获内存警告。但是,在触发内存警告的模拟器上,会释放一些额外的内存,但它永远不会回到基线。
-
我的问题具体......
Q1)这些结果是否可以接受?
Q2)现实世界中无法实现净零记忆变化吗?如果是这样,那么对于每个UIViewController有大量对象的实际应用程序泄漏的内存量是多少? 100kB,200kB ......?
Q3)我应该使用什么样的设计模式?还有其他人吗?效率更高?
再次感谢你们。
答案 0 :(得分:1)
一个有趣的问题。以下是一些想法:
1)看起来你正在使用故事板。故事板是iOS生态系统中的怪兽。它们就像笔尖一样,但似乎还有额外的缓存逻辑。我会尝试在不使用故事板的情况下重现您的结果,看看你得到了什么。
2)带转换控制器的第二个版本是有意义的,你需要占用更多内存,因为你现在有一个额外的视图控制器在播放超过原来的两个,所以这会占用额外的内存。
总体而言,随着操作系统构建其缓存以及为您运行时缓存内容,您将在应用程序中获得一些内存增长。根据应用程序的大小,您可能会增加50k或5000k内存。在这种特殊情况下,我认为15-30k的增长是可以接受的。