2010-05-27 2 views
0

Je suis curieux de savoir s'il y a une bonne raison pour laquelle je ne devrais/ne devriez pas utiliser @synthesize pour le tabBarController ci-dessous, ou cela n'a-t-il pas d'importance?@synthesize avec UITabBarController?

@implementation ScramAppDelegate 
@synthesize window; 
@synthesize tabBarController; 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    [self setTabBarController:[[UITabBarController alloc] init]]; 
    [window addSubview:[tabBarController view]]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

-(void)dealloc { 
    [tabBarController release]; 
    [self setTabBarController: nil]; 
    [window release]; 
    [super dealloc]; 
} 

OU

@implementation ScramAppDelegate 
@synthesize window; 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    tabBarController = [[UITabBarController alloc] init]; 
    [window addSubview:[tabBarController view]]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

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

acclamations Gary

Répondre

1

Personnellement, je ne dérange pas avec @property s pour mes contrôleurs de vue dans ma classe de délégué de l'application. Principalement parce que le délégué de l'application se trouve en haut de la hiérarchie des vues, et il n'a pas besoin d'exposer ses variables membres à quiconque.

Une autre raison de ne pas vient de la ligne:

tabBarController = [[UITabBarController alloc] init]; 

Depuis si tabBarController est un @property ensemble à retain, vous double conserviez l'objet, qui est une forme de fuite de mémoire (bien que relativement bénigne puisque cela se passe au niveau du délégué de l'application).

+0

Je pensais la même chose au sujet de la fuite de mémoire, c'est pourquoi j'ai fait [version de TabBarController]; et [self setTabBarController: nil]; en dealloc. Par ma manière de penser qui aboutit à la gestion correcte de la mémoire, bien que ce soit un peu académique, le dealloc ne se fait jamais appeler car les applications libèrent toute sa mémoire à la sortie de toute façon. – fuzzygoat

+0

Le problème est que vous l'avez 'conservé' deux fois ('alloc' incrémente le nombre de retain, et ensuite votre propriété est définie sur' retain', donc le setter incrémenté sera incrémenté une seconde fois), donc si vous ' re relâcher une fois, puis le mettre à zéro, vous allez créer une fuite de mémoire. –

+0

de sorte que le nombre de retenue est de 2, après la libération de son 1, après l'ensemble nil est libéré à nouveau (maintenant son 0) et nul est conservé? – fuzzygoat

-1

Si tabBarController est une propriété (déclarée dans votre fichier .h avec @property (nonatomic, retain) TabBarController *tabBarController), et que vous voulez créer automatiquement getter et setter pour elle, vous devez utiliser @synthesize dans votre fichier .m. Si vous voulez implémenter le getter et le setter vous-même, vous devez spécifier @dynamic tabBarController.

+0

Il est seulement nécessaire d'utiliser la directive @dynamic si vous n'utilisez pas @synthesize _et_ vous n'implémentez pas vos propres getters et setters immédiatement, par exemple si Core Data les crée pour vous pour les propriétés modélisées. Si votre fichier .m contient des getters et des setters avec les noms et les types appropriés, vous n'avez pas besoin d'utiliser @synthesize ou @dynamic. –

Questions connexes