1

我有一个 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。这是正确的方法吗?我真的有内存泄漏吗?

提前致谢,

安德烈亚斯

4

1 回答 1

1

你的方法看起来不错,但有更好的测试方法,而不是仅仅盯着它。使用 Mac 附带的 Instruments 工具来测试是否有泄漏。

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

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

希望这可以帮助。

于 2011-09-09T13:29:19.080 回答