освобождение viewcontroller в applicationDidFinishLaunchingWithOptions - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть приложение на основе навигации, и я вижу утечку в методе 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] после строки windows addSubview приводит к исчезновению моего viewcontroller. Добавление autorelease к строке alloc останавливает приложение и не может перенаправить на следующий вид.Я хотел бы исправить все утечки, прежде чем отправить приложение в магазин приложений.Может кто-нибудь, пожалуйста, скажите мне, каково правильное место для выпуска rootViewController.

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Вы можете просто сохранить контроллер навигации в @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 в качестве подпредставления, просто установите вместо этого rootviewcontroller окна.

Так сделайте это:

self.window.rootViewController = self.navController;

вместо:

[window addSubview:[nvc view]];

Тогда, конечно, создание вашего контроллера навигации становится:

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

Предполагая, что вы только что создали 'viewcontroller' ранее (вы этого не показывали)

0 голосов
/ 30 ноября 2011

Я могу ошибаться, но я считаю, что обычно rootviewcontroller обычно подобен делегату, то есть никогда не освобождается до закрытия приложения. однако, чтобы ответить на ваш вопрос, правильное место для выпуска большинства вещей находится в методе dealloc (просто добавьте его, если его там нет, он будет вызван)

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

сообщение о том, что я похож на меня: http://www.iphonedevsdk.com/forum/iphone-sdk-development/5953-navigationcontroller-appdelegate-crash.html

не могу найти официальную ссылку, но я уверен, что я прав

...