2011-08-20 8 views
3

Vaut-il mieux créer uniquement une variable d'instance pour un contrôle ou une variable d'instance avec une propriété dans l'objectif c/xcode?Meilleures pratiques de contrôle

Si vous souhaitez créer une propriété, il est préférable de la rendre atomique ou non atomique (pour un contrôle).

Par exemple, quelle est la meilleure pratique pour faire ce qui suit:

@interface blah 
{ 
    UILabel *label; 
} 

@property (nonatomic, retain) IBOutlet UILabel *label; 

OU

@interface blah 
{ 
    IBOutlet UILabel *label; 
} 

OU

@interface blah 
{  
    UILabel *label; 
} 

@property (retain) IBOutlet UILabel *label; 

Puis, quand je dealloc est-il préférable de faire:

[self.label release] 

ou [version label]

EDIT:

Donc, pour résumer ...

  1. Lors du référencement des contrôles dans votre code, vous devez utiliser les variables d'instance
  2. En dealloc, vous peut libérer les contrôles par [version iVal] \

Répondre

1

Je ne créerais pas ap roperty pour label car il n'a pas besoin d'être accessible en dehors de UIViewController, donc j'utiliserais un second cas. La chose concernant l'atomicité - la logique dicte que puisque UI devrait être mis à jour à partir du thread principal seulement, UILabel devrait être accessible uniquement dans le thread principal aussi. Donc, ce n'est pas grave si vous déclarez votre propriété nonatomic ou atomic, vous auriez accès et modifier cette var UILabel seulement à partir du fil principal.

En ce qui concerne les performances, les propriétés nonatomic sont également plus rapides car l'accès n'a pas besoin d'acquérir de verrou.

+0

Merci. Donc en ce qui concerne dealloc ... quand j'ai une propriété, est-ce que je fais [self.propName release] ou [ival release]? – user472292

+0

Je suppose aussi que pour un ival, j'ai toujours besoin de sortir en dealloc et de le faire [version d'ival] – user472292

+0

Quand vous avez une propriété, je la mets à "nil". AFAIK il fait une 'release' automatiquement, pas sûr cependant. Je n'ai pas utilisé de propriétés depuis des années puisque je les gère via des variables d'instance. – Eimantas

1

Si vous utilisez le constructeur d'interface, déclarant alors

IBOutlet UILabel *label; 

avertit l'IB qu'il ya une étiquette qui peut être liée. Cela vous permet de modifier l'étiquette que vous créez dans l'IB en utilisant le pointeur label. Cependant, si l'étiquette n'a jamais besoin d'être modifiée, il n'est pas nécessaire de la déclarer ou de la référencer du tout. Il suffit de le créer dans le IB et de le laisser à cela. Dans ce cas, il n'y a pas besoin de méthodes getter ou setter, et donc pas besoin d'utiliser @property ou @synthesize du tout.

Si vous créez et configurez l'étiquette entièrement par programme, il n'est pas nécessaire de la déclarer IBOutlet. Il suffit d'utiliser

UILabel *label; 

puis réglez le label que vous le souhaitez dans votre code. L'IB n'a pas besoin de savoir qu'il existe. Ensuite, créez des méthodes getter et setter si vous en avez besoin.

1

Vous souhaitez éviter d'utiliser des appels de méthode dans votre méthode dealloc.Vous pouvez rencontrer une condition dans laquelle votre accesseur accède à une autre de vos variables d'instance qui ont déjà été libérées. Il est plus sûr de simplement libérer la variable d'instance.

[label release]; 

Et si vous décidez de sortir via l'accesseur, utilisez les éléments suivants (comme indiqué par fichek):

self.label = nil;