我有一个基于导航的应用程序,我在应用程序委托中的applicationDidFinishLaunchingWithOptions
方法中看到了泄漏。我不确定在哪里释放viewController
。
头文件:
@class ViewController;
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
ViewController *viewController;
}
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) ViewController *viewController;
@end
。m文件
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:viewController];
nvc.navigationBar.tintColor = [UIColor grayColor];
nvc.navigationBar.barStyle = UIBarStyleDefault;
[window addSubview:[nvc view]];
[window makeKeyAndVisible];
return YES;
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
在windows addSubview
行之后添加[nvc release]
使我的viewcontroller
消失。将autorelease
添加到alloc
行冻结应用程序,无法重定向到下一个视图。我想修复所有泄漏之前,我提交的应用程序到应用商店。谁能告诉我什么是正确的地方释放rootViewController
.
谢谢。
你可以把导航控制器保存在应用程序委托的@property中,而不是视图控制器中。这样就可以了:
Header file:
#import <UIKit/UIKit.h>
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UINavigationController *navController;
}
// if using current compiler, just omit these ivars above
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) UINavigationController *navController;
@end
然后像往常一样@synthesize并释放dealloc中的后备实例变量。
顺便说一句,如果你不需要支持iOS3,那么不要将导航控制器的视图添加为子视图,只需设置窗口的rootviewcontroller即可。
那么这样做:
self.window.rootViewController = self.navController;
代替:
[window addSubview:[nvc view]];
然后创建导航控制器变成:
self.navController = [[[UINavigationController alloc] initWithRootViewController:viewController] autorelease];
[viewController release];
假设你刚才创建了'viewcontroller'(你没有显示)
我可能是错的,但我相信通常rootviewcontroller通常就像委托一样,意味着它永远不会被释放,直到应用程序关闭。然而,为了回答你的问题,释放大多数东西的适当位置是在dealloc方法中(如果不在那里,只需添加它,它将被调用)
-(void)dealloc
{
[varName release];
}
帖子说的和我一样:http://www.iphonedevsdk.com/forum/iphone-sdk-development/5953-navigationcontroller-appdelegate-crash.html
找不到官方链接,但我很确定我是对的