PushViewController: это утечка памяти? - PullRequest
0 голосов
/ 30 декабря 2011

Я разрабатываю iOS 4 с последним SDK и XCode 4.2 (я не использую ARC ).

Я разрабатываю контроллер навигациипрограммно, и у меня есть вопрос.

Это AppDelegate.h

#import <UIKit/UIKit.h>

@class ViewController;
@class SecondViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    UINavigationController* navController;
    ViewController* viewController;
    SecondViewController* secondViewController;
}

@property (strong, nonatomic) UIWindow *window;

- (void) showSecondViewController;

@end

А это AppDelegate.m

    #import "AppDelegate.h"

    #import "ViewController.h"
    #import "SecondViewController.h"

    @implementation AppDelegate

    @synthesize window = _window;

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
        viewController.title = @"Menu";
        navController = [[UINavigationController alloc] initWithRootViewController:viewController];
        navController.navigationBar.tintColor = [UIColor blackColor];
        self.window.rootViewController = navController;

        [self.window makeKeyAndVisible];
        return YES;
    }

- (void) dealloc
{
   [_window release];
   [viewController release];
   [navController release];
   [secondViewController release];
}
    - (void)applicationWillResignActive:(UIApplication *)application
    {
        ...
    }

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        ...
    }

    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        ...
    }

    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        ...
    }

    - (void)applicationWillTerminate:(UIApplication *)application
    {
        ...
    }

    - (void) showSecondViewController
    {
        secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        secondViewController.title = @"Second";
        [navController pushViewController:secondViewController animated:YES];
    }

Мой вопрос о последнем методе, -(void)showSecondViewController;

Могу ли я добавить эту строку в конце?

[secondViewController release]

Я профилировал приложение и не обнаружил утечек памяти,Но я должен спросить это здесь, потому что я не уверен.

1 Ответ

1 голос
/ 30 декабря 2011

Вы получите утечку памяти при повторном вызове метода showSecondViewController.

Вы должны сбросить secondViewController в вашем showSecondViewController методе.

- (void) showSecondViewController
{
    secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    secondViewController.title = @"Second";
    [navController pushViewController:secondViewController animated:YES];
    [secondViewController release]
}

Он будет автоматически сохранен navController, когда вы выполните pushViewController:secondViewController

...