在applicationDidFinishLaunchingWithOptions中释放viewcontroller

时间:2011-11-30 18:20:24

标签: iphone objective-c memory-leaks

我有一个基于导航的应用程序,我看到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的正确位置。

谢谢。

2 个答案:

答案 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

无法找到官方链接,但我非常确定我是对的