我有一个基于导航的应用程序,我看到app委托中的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];
}
在[nvc release]
行之后添加addSubview
会使我的viewcontroller
消失。将autorelease
添加到alloc
行冻结应用,无法重定向到下一个观点。在将应用程序提交到应用程序商店之前,我想修复所有泄漏。任何人都可以告诉我发布rootViewController
的正确位置。
谢谢。
答案 0 :(得分:1)
您可以将导航控制器保留在应用程序委托的@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'(您没有显示)
答案 1 :(得分:0)
我可能是错的,但我相信通常rootviewcontroller通常就像委托一样意味着它永远不会被释放,直到应用程序关闭。然而,为了回答你的问题,释放大多数东西的适当位置是在dealloc方法中(如果它不存在则添加它,它将被调用)
-(void)dealloc
{
[varName release];
}
发帖说像我这样的骗局: http://www.iphonedevsdk.com/forum/iphone-sdk-development/5953-navigationcontroller-appdelegate-crash.html
无法找到官方链接,但我非常确定我是对的