Ai-je besoin de libérer des ressources de xib?

voix
37

Si j'ai quelque chose comme un UILabel lié à un fichier xib, dois-je sortir sur dealloc de mon avis? La raison pour laquelle je demande est parce que je n'alloc, ce qui me fait penser que je ne ai pas besoin de le libérer soit? par exemple (dans l'en-tête):

IBOutlet UILabel *lblExample;

dans la mise en œuvre:

....
[lblExample setText:@whatever];
....

-(void)dealloc{
    [lblExample release];//?????????
}
Créé 15/09/2008 à 02:51
utilisateur
Dans d'autres langues...                            


8 réponses

Créé 15/09/2008 à 02:58
source utilisateur

voix
0

Vous faites Alloc l'étiquette, dans un sens, en créant dans IB.

Qu'est-ce que IB fait, est de regarder vos IBOutlets et comment ils sont définis. Si vous avez une variable de classe IB est d'attribuer une référence à un objet, IB envoie un message Retain cet objet pour vous.

Si vous utilisez des propriétés, IB utilisera la propriété que vous devez définir la valeur et ne conserverons pas explicitement la valeur. Ainsi, vous marquerait normalement des propriétés IBOutlet que retenir:

@property (nonatomic, retain) UILabel *lblExample;

Ainsi, dans le cas où l'éther (en utilisant les propriétés ou non), vous devez appeler la libération dans votre dealloc.

Créé 15/09/2008 à 03:49
source utilisateur

voix
4

J'ai trouvé ce que je cherchais dans la documentation Apple. En bref, vous pouvez configurer vos objets comme des propriétés que vous fermiez et retiendrez (ou tout simplement @property @synthesize), mais vous ne devez pas pour des choses comme UILabels:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/chapter_3_section_4.html#//apple_ref/doc/uid/10000051i-CH4-SW18

Créé 15/09/2008 à 05:47
source utilisateur

voix
0

Toute IBOutlet qui est une sous-vue de votre vue principale Nib n'a pas besoin d'être libérés, car ils seront envoyés le message autorelease lors de la création d'objets. Le seul est vous IBOutlet besoin de libérer dans votre dealloc sont des objets de haut niveau tels que les contrôleurs ou autres NSObject de. Tout cela est mentionné dans le document d'Apple lien ci-dessus.

Créé 15/09/2008 à 12:44
source utilisateur

voix
35

Si vous suivez ce qui est maintenant considéré comme la meilleure pratique, vous devez libérer les propriétés de sortie, parce que vous auriez dû les retenus dans le accesseur set:

@interface MyController : MySuperclass {
    Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end


@implementation MyController

@synthesize uiElement;

- (void)dealloc {
    [uiElement release];
    [super dealloc];
}
@end

L'avantage de cette approche est qu'elle rend la sémantique de gestion de la mémoire explicite et claire, et il fonctionne de manière cohérente sur toutes les plateformes pour tous les fichiers nib .

Note: Les commentaires qui suivent ne concernent que iOS avant 3.0. Avec 3.0 et versions ultérieures, vous devriez plutôt simplement nul sur la valeur des propriétés dans viewDidUnload.

Une considération ici, cependant, est quand votre contrôleur pourrait disposer de son interface utilisateur et recharger dynamiquement à la demande (par exemple, si vous avez un contrôleur de vue qui charge une vue à partir d' un fichier nib, mais sur demande - dire sous la pression de la mémoire - le libère, avec l'espoir qu'il puisse être rechargé si la vue est à nouveau nécessaire). Dans cette situation, vous voulez vous assurer que lorsque la vue principale est disposé vous aussi renoncer à la propriété des autres points de vente afin qu'ils puissent eux aussi être désallouées. Pour UIViewController, vous pouvez régler ce problème en remplaçant setView:comme suit:

- (void)setView:(UIView *)newView {
    if (newView == nil) {
        self.uiElement = nil;
    }
    [super setView:aView];
}

Malheureusement , cela donne lieu à une autre question. Parce que UIViewController met actuellement en œuvre sa deallocméthode en utilisant la setView:méthode accesseur (plutôt que de libérer simplement directement la variable), self.anOutlet = nilsera appelé dealloc, ainsi que , en réponse à un avertissement de mémoire ... Cela conduira à un accident dans dealloc.

Le remède est d'assurer que les variables de sortie sont également mis à nilen dealloc:

- (void)dealloc {
    // release outlets and set variables to nil
    [anOutlet release], anOutlet = nil;
    [super dealloc];
}
Créé 10/10/2008 à 14:41
source utilisateur

voix
3

le

[anOutlet release], anOutlet = nil;

Une partie est tout à fait superflue si vous avez écrit setView: correctement.

Créé 20/02/2009 à 00:26
source utilisateur

voix
1

Si vous ne relâchez pas sur dealloc il soulèvera l'empreinte mémoire.

Voir plus de détails ici avec un instrument graphique ObjectAlloc

Créé 19/02/2010 à 10:05
source utilisateur

voix
0

Si vous ne définissez la IBOutlet comme une propriété, mais simplement comme une variable d'instance, vous devez quand même le libérer. En effet, sur initWithNib, la mémoire sera allouée pour tous IBOutlets. Donc, c'est l'un des cas particuliers, vous devez libérer même si vous ne l'avez pas conservé ou alloc'd une mémoire dans le code.

Créé 13/04/2012 à 03:28
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more