在applicationDidFinishLaunchingWithOptions中释放视图控制器



我有一个基于导航的应用程序,我在应用程序委托中的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

找不到官方链接,但我很确定我是对的

最新更新