【问题标题】:iOS - MultiView Application - Memory concernsiOS - 多视图应用程序 - 内存问题
【发布时间】:2011-09-09 12:00:46
【问题描述】:

我有一个 MultiView 应用程序,但我有一些内存问题,希望能得到一些建议。 我有一个应用程序,它最初加载一个开关控制器,使用户能够在某些视图之间进行更改。在应用程序期间的某个时刻,我想删除 switchview 控制器并向窗口添加另一个子视图。因此,我获得了对共享应用程序委托的访问权限并删除了 switchview 控制器并插入了第二个。我不明白如果这是正确的方法,我担心会发生内存泄漏,因为我打印了第二个控制器的 retainCount 值,它显示 19!!!!!!

以下是我的代码快照。这是正确的方法吗?如何避免这些内存泄漏?

好的,在我的 ApplicationDelegate 中,我有两个视图控制器,我也将它们设置为属性

MyAppDelegate.h

@class SwitchViewController;
@class SecondController;

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {

    SwitchViewController *switchViewController;
    SecondController *secondController;  
}


@property (nonatomic, retain) IBOutlet SwitchViewController *switchViewController;
@property (nonatomic, retain) IBOutlet SecondController *secondController;

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

在我添加的 .m 文件中

[self.window addSubview:switchViewController.view];
[self.window makeKeyAndVisible];

请注意,我正在合成这些控制器并在 dealloc 函数中释放它们

现在这是我的问题!在 SwitchViewController.m 中,我想访问我的 App 的委托,删除当前的 SwitchViewController 并将我的 secondController 作为窗口的子视图:

 SwitchViewController.m

 SecondController *secondController2= [[SecondController alloc] init];

 MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

 [appDelegate.switchViewController.view removeFromSuperview];

  appDelegate.secondController = secondController2;

  [appDelegate.window addSubview:appDelegate.secondController.view];

  [secondController2 release]; 

问题来了。当我打印出 [appDelegate.secondController retainCounter] 时,我得到 19。这是正确的方法吗?我真的有内存泄漏吗?

提前致谢,

安德烈亚斯

【问题讨论】:

  • 您不应该使用对象的保留计数。它很少用,经常会引起混乱。
  • 好的,谢谢您的提示。不过,您是否建议这是在我的应用程序委托中的窗口上加载不同子视图的正确方法?内存安全吗?

标签: iphone ios memory memory-leaks multiview


【解决方案1】:

您的方法看起来不错,但除了目测之外,还有更好的测试方法。使用 Mac 附带的 Instruments 工具来测试是否存在泄漏。

另外,作为旁注,还有一种更好的方法来进行转换

[UIView transitionFromView:appDelegate.switchViewController.view 
                    toView:appDelegate.secondController.view
                  duration:1.0 
                   options:UIViewAnimationOptionTransitionNone 
                completion:nil];

希望这会有所帮助。

【讨论】:

  • Silvae 这很有帮助,谢谢您的回答!我不只是盯着它,我实际上使用了 Instruments 工具,没有发现任何泄漏。我只是不相信我使用的是正确的方法..它似乎不正确
  • 如果 Instruments 说它是正确的,而不是我说你不用担心太多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多