2009-08-09 3 views
1

Ich habe einige der View-Code aus Erica Saduns Buch "The iPhone Developer's Cookbook" ausprobiert und habe einen Code gefunden, den ich nicht verstehe. Hier ist der Code für eine Methode Loadview:Warum funktioniert dieser Code aus dem iPhone Developer's Cookbook?

- (void)loadView 
{ 
    // Create the main view 
    UIView *contentView = [[UIView alloc] initWithFrame: 
     [[UIScreen mainScreen] applicationFrame]]; 
    contentView.backgroundColor = [UIColor whiteColor]; 
    self.view = contentView; 
    [contentView release]; 

    // Get the view bounds as our starting point 
    CGRect apprect = [contentView bounds]; 

    // Add each inset subview 
    UIView *subview = [[UIView alloc] 
     initWithFrame:CGRectInset(apprect, 32.0f, 32.0f)]; 
    subview.backgroundColor = [UIColor lightGrayColor]; 
    [contentView addSubview:subview]; 
    [subview release]; 
} 

Meine Frage ist, warum sie loslassen content, aber es dann wieder verwenden in [contentView addSubview:subview]? Hat self.view = contentView containedView beibehalten?

+0

Das sieht falsch aus. 'contentView' wird nicht bis zum Ende der Methode freigegeben, so dass dies wahrscheinlich keine Probleme verursacht, aber ich kann mir nicht vorstellen, warum Sie es absichtlich so bauen würden. – kubi

+0

Nicht wirklich. Die Zuweisung zu self.view behält contentView bei, so dass es nach dem Erstellen des Objekts am nächsten kommt. Es ist absichtlich so aufgebaut, weil es (im Cocoa-Paradigma) sinnvoll ist, dass der View-Controller die Ansicht behält. –

Antwort

7

Wenn Sie in der Dokumentation zu UIViewController suchen, werden Sie sehen, dass die Ansicht Eigenschaft deklariert als:

@property(nonatomic, retain) UIView *view;

Dies bedeutet, dass, wenn Sie die setView: Methode (Oder verwenden Sie .view auf der linken Seite des =), dann wird der Wert, den Sie übergeben, beibehalten. Also, wenn Sie den Code durchgehen und schauen, zählt behalten, werden Sie diese:

- (void)loadView { 
    // Create the main view 
    UIView *contentView = [[UIView alloc] initWithFrame: 
      [[UIScreen mainScreen] applicationFrame]]; //retain count +1 
    contentView.backgroundColor = [UIColor whiteColor]; //retain count +1 
    self.view = contentView; //retain count +2 
    [contentView release]; //retain count +1 

    // Get the view bounds as our starting point 
    CGRect apprect = [contentView bounds]; 

    // Add each inset subview 
    UIView *subview = [[UIView alloc] 
      initWithFrame:CGRectInset(apprect, 32.0f, 32.0f)]; 
    subview.backgroundColor = [UIColor lightGrayColor]; 
    [contentView addSubview:subview]; 
    [subview release]; 

}

Ich würde sagen, dass die wirklich interessante Sache ist, dass nach Freigabe content, können wir immer noch Senden Sie Nachrichten an sie, da das Objekt, das am Ende des contentView-Zeigers existiert, noch existiert (da es durch Aufrufen von setView beibehalten wurde :).

+1

Dies ist richtig, aber ich persönlich vermeide diese Art/Muster - wenn Sie irgendwann entscheiden, diese Eigenschaft von 'zu ändern' zu 'zuweisen', dann wird dieser Code stürzt spontan ab. Dies ist natürlich kein Problem mit der UIViewController.view-Eigenschaft, aber für Ihre eigenen Eigenschaften wird nach Problemen gefragt. –

+1

Ja, genau deshalb funktioniert es, und es ist eine schreckliche Form. Sobald Sie eine bestimmte Referenz freigeben, sollten Sie sie nicht mehr verwenden, da sie fehleranfällig ist. Die Veröffentlichung sollte entweder zu Ende verschoben werden, oder alle Inhalte von contentView, die über die Veröffentlichung hinausgehen, sollten in self.view geändert werden. –

+0

Es qualifiziert sich nicht wirklich als Stil, außer " als schädlich" ist ein Stil. – Amagrammer

0

Wenn Sie Ihre Eigenschaft wie folgt deklarieren @Eigenschaft (nichtatomisch, behalten) ... TheN ja die Eigenschaft wird beibehalten, wenn zugewiesen. das ist wahrscheinlich das, was vor sich geht

+0

Die Formulierung einer grammatikalisch korrekten Antwort und die Vermeidung von IM-Stil-Abkürzungen wird wahrscheinlich helfen, Downvotes in der Zukunft zu vermeiden. (Ich habe nicht downvote, ich sage nur ...) –

+0

Ich weiß, aber es ist schwer beim Tippen Antworten vom iPhone lol, wenn ich schreibe ich das absolute Minimum und kann nicht wirklich gut formulieren, aber ich denke Diese Antwort würde helfen der Fragesteller sowieso, also habe ich es – Daniel

Verwandte Themen