2013-02-27 14 views
11

ho usato un po 'di codice sorgente:Assegnazione di un oggetto mantenuto a una proprietà debole; oggetto verrà rilasciato dopo l'assegnazione

KGModalContainerView *containerView = 
    self.containerView = 
     [[KGModalContainerView alloc] initWithFrame:containerViewRect]; 

Mi dà: Assigning retained object to weak property; object will be released after assignment

edit:

@interface KGModal() 
    @property (strong, nonatomic) UIWindow *window; 
    @property (weak, nonatomic) KGModalViewController *viewController; 
    @property (weak, nonatomic) KGModalContainerView *containerView; 
    @property (weak, nonatomic) UIView *contentView; 
@end 

KGModalContainerView *containerView = 
    self.containerView = 
     [[KGModalContainerView alloc] initWithFrame:containerViewRect]; 
containerView.modalBackgroundColor = self.modalBackgroundColor; 
containerView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | 
           UIViewAutoresizingFlexibleRightMargin | 
           UIViewAutoresizingFlexibleTopMargin | 
           UIViewAutoresizingFlexibleBottomMargin; 
containerView.layer.rasterizationScale = [[UIScreen mainScreen] scale]; 
contentView.frame = (CGRect){padding, padding, contentView.bounds.size}; 
[containerView addSubview:contentView]; 
[viewController.view addSubview:containerView]; 
+1

Non ci sono abbastanza informazioni per rispondere alla tua domanda. Come viene definito 'self.containerView'? 'KGModalContainerView' è compilato con ARC? – trojanfoe

+0

modifica la mia domanda, sto usando ARC – pengwang

+0

Davvero hai davvero due compiti in una riga? Cosa succede se non lo fai? Perché devi assegnare a un 'containerView' * e * locale a una proprietà' self.containerView'? Qual è il punto di ciò che dovrebbe essere? – matt

risposta

28

Suppongo che la vostra proprietà containerView viene dichiarato con weak attributo. Se si desidera avere un attributo weak in una proprietà, qualcuno dovrebbe averlo già conservato. Ecco un esempio:

@property (nonatomic, weak) KGModalContainerView *containerView; 
... 
-(void)viewDidLoad { 
    [super viewDidLoad]; 
    KGModalContainerView *myContainerView = [[KGModalContainerView alloc] initWithFrame:containerViewRect]; // This is a strong reference to that view 
    [self.view addSubview:myContainerView]; //Here self.view retains myContainerView 
    self.containerView = myContainerView; // Now self.containerView has weak reference to that view, but if your self.view removes this view, self.containerView will automatically go to nil. 

// In the end ARC will release myContainerView, but it's retained by self.view and weak referenced by self.containerView 
} 
+1

modifico il codice, ma ho anche waring – pengwang

2

I miei 2 centesimi come un principiante in Objective C:

Il lato destro della linea che dà l'avvertimento,

[[KGModalContainerView alloc] initWithFrame:containerViewRect] 

crea un oggetto nel mucchio ea questo punto questo oggetto non è referenziato da nessun puntatore. Quindi questo oggetto è assegnato a self.containerView. Poiché self.myContainerView è debole, l'assegnazione non aumenta il conteggio dei riferimenti dell'oggetto creato sul lato destro. Quindi, quando l'assegnazione è terminata, il conteggio dei riferimenti dell'oggetto è ancora 0, quindi ARC rilascia immediatamente l'oggetto.

Problemi correlati