2011-11-30 88 views
0

我有一個基於導航的應用程序,並在應用程序委託中看到applicationDidFinishLaunchingWithOptions方法中的泄漏。我不知道在哪裏發佈viewController在applicationDidFinishLaunchingWithOptions中釋放視圖控制器

頭文件:

@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消失.Adding autoreleasealloc行凍結的應用並且不能重定向到下一個視圖。我想在將應用程序提交到應用程序商店之前修復所有泄漏。任何人都可以告訴我什麼是正確的地方釋放rootViewController

謝謝。

回答

0

我可能是錯的,但我相信,通常rootviewcontroller通常就像委託意味着它從未發佈,直到應用程序關閉。但是回答你的問題的適當場所釋放的大多數事情是在dealloc方法(只是如果添加它它不存在,它會被稱爲)

-(void)dealloc 
{ 
[varName release]; 
} 

後說simliar事情,我說: http://www.iphonedevsdk.com/forum/iphone-sdk-development/5953-navigationcontroller-appdelegate-crash.html

找不到官方的鏈接,但我很確定我的權利

+0

請不要火焰我,我明白即使這個詞最危險,因爲有很多時間釋放到別的地方。即時通訊只是說新的目標C和可可觸摸人的規範 –

+0

我釋放dealloc方法中的viewController。我想釋放nvc(navigationViewController),我正在初始化applicationDidFinishLaunchingWithOptions方法。 – curious123

+0

不是您的主窗口上的導航控制器,並在您的代表?你的問題特別說「釋放rootviewcontroller」而不是nvc。但無論哪種方式,你的nvc聲明在哪裏(我在上面的代碼中看到它,但我不知道那是什麼文件) –

1

您可以將導航控制器保留在應用委託的@property而不是viewcontroller中。所以這將工作:

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,那麼不要將nav controller的視圖添加爲子視圖,只需設置窗口的rootviewcontroller即可。

所以這樣做:代替

self.window.rootViewController = self.navController; 

[window addSubview:[nvc view]]; 

當然然後創建導航控制器變爲:

self.navController = [[[UINavigationController alloc] initWithRootViewController:viewController] autorelease]; 
[viewController release]; 

假設你剛剛創建 '視圖 - 控制' 早期(你沒有表現出來)

+0

這解決了我的問題,謝謝 – curious123

+0

很高興幫助。 –

相關問題