2013-02-27 9 views
11

ich einige Quellcode verwendet:Zugewiesenes Objekt einer schwachen Eigenschaft zuweisen; Objekt wird nach der Abtretung freigegeben

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

Es gibt mir: 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

Es sind nicht genügend Informationen verfügbar, um Ihre Frage zu beantworten. Wie ist 'self.containerView' definiert? Wird 'KGModalContainerView' mit ARC kompiliert? – trojanfoe

+0

ich bearbeite meine Frage, ich benutze ARC – pengwang

+0

Müssen Sie wirklich wirklich zwei Aufgaben in einer Zeile haben? Was passiert, wenn Sie das nicht tun? Warum müssen Sie einem lokalen 'containerView' * und * einer Eigenschaft' self.containerView' zuweisen? Was soll das sein? – matt

Antwort

28

ich Ihre containerView Eigenschaft annehmen wird erklärt mit weak Attribut. Wenn Sie ein Attribut weak zu einer Eigenschaft haben möchten, sollte jemand es bereits behalten haben. Hier ein Beispiel:

@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

Ich modifiziere den Code, aber auch Waring – pengwang

2

Mein 2 Cent als Anfänger in Objective C:

Die rechte Seite der Linie, die die Warnung gibt,

[[KGModalContainerView alloc] initWithFrame:containerViewRect] 

ein Objekt im Heap erzeugt und an diesem Punkt wird dieses Objekt von keinem Zeiger referenziert. Dann wird dieses Objekt self.containerView zugewiesen. Da self.myContainerView schwach ist, erhöht die Zuweisung die Referenzzahl des auf der rechten Seite erstellten Objekts nicht. Wenn die Zuweisung abgeschlossen ist, ist die Referenzzahl des Objekts immer noch 0, und daher gibt ARC das Objekt sofort frei.

Verwandte Themen