2010-11-17 4 views
0

Je suis novice en programmation iOS et j'ai lu des articles utiles sur la libération et l'allocation de la mémoire et j'ai pensé que je comprenais le concept. Mais pendant le codage proprement dit, je ne peux pas vraiment appliquer la théorie. Je suis vraiment confus sur les fondamentaux de la programmation iOS et j'espère que quelqu'un peut aider. Merci d'avance! 1er comportement - Certaines des applications que je vois peuvent maintenir l'état actuel des fenêtres lorsque le bouton d'accueil de l'iPhone est pressé de sorte que lorsque l'application est lancée la prochaine fois, il affichera le dernier état. 2ème comportement - Certaines autres applications se comporteront comme une nouvelle startup à chaque lancement. Le texte, les images, etc. précédemment affichés seront effacés et commenceront toujours à la première page. Ce que je voulais faire est comme le 2ème comportement - effacer tout quand le bouton d'accueil est pressé et recommencer chaque fois qu'il est lancé.Allocation et libération de contrôleurs d'interface utilisateur

J'ai créé un projet de barre d'onglets. Les codes ci-dessous entraîneront le 1er comportement.

J'ai essayé de relâcher tous les contrôleurs de tabulation à applicationDidEnterBackground à la place de dealloc mais cela n'a pas fonctionné. Il affichera toujours le dernier écran.

Mes questions ...

1) Si je .L'appel, il ne devrait pas détruire la fenêtre ainsi? par exemple. [Version NavController1]. Il semble que la fenêtre peut toujours fonctionner comme d'habitude ...

2) Que devrais-je changer pour aboutir au 2ème comportement?

3) Si j'affecte tabBarController.viewControllers = nil, cela signifie-t-il que la mémoire des pages qui y sont attachées précédemment sera libérée?

4) Dois-je publier des variables IBOutlets? par exemple. Fenêtre UIWindow *, UITabBarController, UITextField ... etc. Ça n'a pas l'air de me donner une fuite de mémoire même si je ne les libère pas. La raison de ceci pourrait être parce que je ne sais pas comment tuer l'application. J'ai essayé de faire le double clic sur le bouton d'accueil de l'iphone pour terminer l'application mais je n'arrive toujours pas à obtenir le débogage pour atteindre la fonction dealloc. Un article dit que si vous l'allouez ou le conservez, vous devriez le libérer. Puisque je n'alloue rien ici, je ne peux pas le libérer? Ou est-il possible de mettre autorelease? Tant que le nombre de conserver


@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]; 
} 

+0

(Vous pouvez appuyer sur le bouton 1010 pour formater le texte en code.) –

Répondre

0

1) 1 est votre contrôleur de vue sera libéré en appelant la libération.

Dans votre code, dealloc ne sera jamais appelé, et par conséquent vos contrôleurs de vue ne seront pas libérés de toute façon. Vous devez tout libérer dans applicationDidEnterBackground ...

2) applicationDidEnterBackground faire quelque chose comme:

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

puis de nouveau tout recréent dans

  • (void) applicationWillEnterForeground: (UIApplication *) Application

3) faisant lancera la première page, NavController1 et NavController2 (et tous les autres contrôleurs de vue que vous avez ajoutés)

4) oui vous devriez. Vous n'obtenez pas de fuite de mémoire dans cette instance, car le délégué ne reçoit jamais de dealloc et, par conséquent, il existe toujours une référence valide aux objets. Non, vous ne pouvez pas libérer automatiquement car autorelease libère l'objet lorsque la pile d'appels revient à la boucle d'exécution.