2010-12-23 7 views
1

Je me demande sur l'allocation d'un objet qui a une propriété de retenir, quelque chose comme ça:Objectif C: conserver vs alloc - revisité

RootViewController *viewController; 

@property (nonatomic, retain) RootViewController *viewController; 


@implementation ... 

viewController = [[RootViewController alloc] init]; 

car ce n'est pas le droit de faire quelque chose comme ça:

self.viewController = [[RootViewController alloc] init]; 

car cela augmentera le nombre de rétention d'objet de 2 et vous devrez libérer votre objet deux fois, dont l'un est dans la méthode dealloc.

Alors serait-il préférable d'utiliser une propriété assign si j'alloue mon objet? ou quand serait-il nécessaire de conserver un objet que j'alloue en utilisant la méthode alloc.

Je suis très confus à propos de ce problème, alors pouvez-vous s'il vous plaît m'expliquer comment cette situation est valable.

Merci beaucoup d'avance et je l'apprécierais vraiment.

Cordialement,

Répondre

7

Lorsque vous passez un objet à un autre endroit que vous attendez de prendre le contrôle de celui-ci, il est pratique courante de autorelease il:

self.viewController = [[[RootViewController alloc] init] autorelease]; 

Ou vous pouvez simplement release vous-même après avoir réglé la variable:

RootViewController *controller=[[RootViewController alloc] init]; 
self.viewController = controller; 
[controller release]; 

Votre premier exemple n'est pas nécessairement mauvaise pratique, mais il y a certainement des programmeurs qui croient qu'il est. Cela dépend beaucoup du contexte.

En utilisant assign serait probablement faux dans cette circonstance.

+2

Bonne réponse. 'assign' serait complètement faux. Notamment, si la valeur était réinitialisée plus tard via, par exemple, 'self.viewController = someOther;', alors * que * ne serait pas un transfert de propriété si la propriété était 'assign'. – bbum

+0

merci pour votre réponse. Mais pourquoi utiliser assign serait faux?et quand devrais-je utiliser Assigner? – mshaaban

+0

@bbum, ça explique vraiment beaucoup. Merci beaucoup pour ton commentaire !! – mshaaban

0

Non, ce que vous devez faire est autorelease votre RootViewController, ou affecter à la Ivar directement dans le cas ci-dessus, où vous prenez possession de l'objet, dès le départ.

+0

merci pour votre réponse, mais je n'ai pas vraiment compris ce que vous voulez dire en prenant possession de l'objet dès le début ?? – mshaaban

+0

Ensuite, vous devez lire les règles de gestion de la mémoire. – jer

1

L'affectation serait erronée. L'attribut 'retain' signifie que votre objet prend possession de viewController. Vous pouvez l'affecter comme cela dans votre initialiseur, mais l'attribut 'retain' détermine ce qui se passe après la création de l'objet si vous définissez viewController sur un objet différent.

Pour un attribut conservé, le poseur généré ressemblera à quelque chose comme ceci:

- (void)setViewController: (UIViewController*)value 
{ 
    if (viewController != value) { 
     [viewController release]; 
    } 
    viewController = [value retain]; 
} 
+0

Merci pour votre réponse. – mshaaban

1

Si vous configurez la propriété que de conserver, puis en utilisant autorelease serait appropriée comme suit:

self.viewController = [[[RootViewController alloc] init] autorelease]; 

Marque Assurez-vous d'utiliser "self". ci-dessus pour vous assurer que vous utilisez le setter synthétisé, qui prendra soin des détails autour de la retenue.