2012-08-30 4 views
1

Je suis novice en Objective-C. Voici ma compréhension (comme dans les commentaires) concernant ARC d'un code simple pour ajouter par programme une sous-vue. S'il vous plait corrigez moi si je me trompe. Surtout sur cette déclaration:Objectif-C: comprendre ARC

"points viewController à myView faiblement" signifie que _myView (le Ivar de ViewController) pointe vers un objet UIView faiblement

// _myView stores a pointer pointing to a UIView object 
// "ViewController points to myView weakly" ACTUALLY means that _myView (ViewController's ivar) points to a UIView object weakly 

@interface ViewController() 
@property (nonatomic,weak) UIView *myView; 
@end 

@implementation 
@synthesize myView = _myView; 
@end 

- (void)viewDidLoad 
{ 
    [superviewDidLoad]; 
    CGRect viewRect = CGRectMake(10, 10, 100, 100); 

    // a UIView object is alloc/inited  
    // mv is a pointer pointing to the UIView object strongly (hence the owner of it) 
    UIView *mv = [[UIView alloc] initWithFrame:viewRect]; 

    // _myView points to the UIView object weakly 
    // Now the UIView object now have two pointers pointing to it 
    // mv points to it strongly 
    // _myView points to it weakly, hence NOT a owner 
    self.myView = mv; 

    // self.view points to the UIView object strongly 
    // Now UIView object now have THREE pointer pointing to it 
    // Two strong and one weak 
    [self.view addSubview:self.myView]; 
} 

// After viewDidLoad is finished, mv is decallocated. 
// Now UIView object now have two pointer pointing to it. self.view points to it strongly hence the owner, while _myView points to it weakly. 

Répondre

3

Vous êtes correctes, à l'exception de cette phrase:

Une fois que viewDidLoad est terminé, mv est décallocalisé.

C'est là où vous avez tort. Rappelez-vous, la désallocation d'un objet ne se produit que lorsque tout le monde qui retain est l'objet release l'est. Ainsi, alors que vous avez release 'd la variable temporaire mv, vous avez encore une autre source qui le conserve: self.view.subviews. Une fois que mv est supprimé du sous-tableau, il peut être correctement nettoyé, _myView est défini sur nil et vous n'avez plus de fuites.

+0

Désolé ma mauvaise. En fait ce que j'essaie de dire est: Après que viewDidLoad est fini, mv (un pointeur fort) est mis à zéro. Est-ce une expression correcte? – Philip007

+3

mv est une variable locale. Une fois qu'il quitte la portée de viewDidLoad, il est défini sur zéro. – Abizern

+0

@Abizern + 1 Abizern. Bon commentaire! –