Выделение и освобождение контроллеров UI - PullRequest
0 голосов
/ 17 ноября 2010

Я новичок в программировании на iOS, прочитал несколько полезных статей о выпуске и распределении памяти и подумал, что понимаю концепцию.Но во время реального кодирования я не могу применить теорию.Я действительно сбит с толку основами программирования на iOS и надеюсь, что кто-то может помочь.Спасибо заранее!

1-е поведение - некоторые приложения, которые я вижу, могут поддерживать текущее состояние окон при нажатии кнопки «Домой» на iPhone, чтобы при следующем запуске приложения оно отображало последнее состояние, в котором оно находитсяв. 2-е поведение - некоторые другие приложения будут вести себя как новый запуск при каждом запуске.Ранее отображенный текст, изображения ... и т. Д. Будут очищены и всегда будут начинаться с первой страницы.

То, что я хотел сделать, это как 2-е поведение - очистить все, когда нажата кнопка «Домой», и начать зановокаждый раз, когда он запускается.

Я создал проект панели вкладок.Приведенные ниже коды приведут к 1-му поведению.

Я попытался освободить все контроллеры вкладок в applicationDidEnterBackground вместо в dealloc, но это не сработало.Он по-прежнему будет отображать последний экран.

Мои вопросы ...

1) Если я позвоню в release, разве это не разрушит и окно?например.Выпуск NavController1.Кажется, что окно все еще может работать как обычно ...

2) Что я должен изменить, чтобы привести ко второму поведению?

3) Если я назначаю tabBarController.viewControllers = nil, делает лиэто означает, что память для страниц, прикрепленных к ней ранее, будет освобождена?

4) Нужно ли выпускать переменные IBOutlets?например.Окно UIWindow *, UITabBarController, UITextField ... и т. Д.Похоже, это не дало мне утечки памяти, даже если я их не отпущу.Причиной этого может быть то, что я не знаю, как убить приложение.Я попытался сделать двойной щелчок по кнопке «Домой» на iphone, чтобы завершить приложение, но я все еще не смог получить отладку для достижения функции dealloc.В статье говорится, что если вы распределяете или сохраняете его, вы должны выпустить его.Так как я здесь ничего не размещаю, могу ли я не выпустить это?Или есть возможность установить авто-релиз?


@interface MyAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
    UINavigationController *NavController1;
    UINavigationController *NavController2;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.
    NavController1 = [[UINavigationController alloc] init];
    NavController2 = [[UINavigationController alloc] init];

    //This view controller inherits UIViewController and has a xib
    FirstViewController *firstpage = [[FirstViewController alloc] init];
    firstpage.title = @"First Page";

    //These view controllers inherits UIViewController and delegate of UINavigationControllerDelegate and has a xib
    SecondViewController *secondpage = [[SecondViewController alloc] init];
    secondpage.title = @"Second Page";
    [NavController1 pushViewController:secondpage animated:YES];
    [secondpage release];

    ThirdViewController *thirdpage = [[ThirdViewController alloc] init];
    thirdpage.title = @"Third Page";
    [NavController2 pushViewController:thirdpage animated:YES];
    [thirdpage release];

    // Add them as children of the tab bar controller
    tabBarController.viewControllers = [NSArray arrayWithObjects:firstpage, NavController1, NavController2, nil];

    // Don't forget memory management
    [firstpage release];

    // Add the tab bar controller's view to the window and display.
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    /*
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
     */
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    /*
     Called as part of  transition from the background to the inactive state: here you can undo many of the changes made on entering the background.
     */
}

- (void)dealloc {
    [NavController1 release];
    [NavController2 release];
    [tabBarController release];
    [window release];
    [super dealloc];
}

1 Ответ

0 голосов
/ 17 ноября 2010

1) Пока счетчик удержаний равен 1, ваш контроллер представления будет освобожден путем вызова release.

В вашем коде не будет вызываться dealloc, и поэтому ваши контроллеры представления не будут освобождены. Вам нужно освободить все в приложении DidEnterBackground ...

2) в приложении DidEnterBackground сделать что-то вроде:

[NavController1 release]; 
NavController1 = nil;
[NavController2 release];
NavController2 = nil;
tabBarController.viewControllers = nil;

затем воссоздайте все заново в

  • (void) applicationWillEnterForeground: (UIApplication *) application

3) при этом будет выпущена первая страница, NavController1 и NavController2 (и любые другие контроллеры представления, которые вы, возможно, добавили)

4) да, вы должны. В этом случае вы не получите утечку памяти, потому что делегат никогда не получит dealloc'd и, следовательно, все еще существует действительная ссылка на объекты. Нет, вы не можете выполнить автоматическое освобождение, так как автоматическое освобождение освободит объект, когда стек вызовов вернется в цикл выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...