2009-08-01 8 views
0

(Wir sprechen über Code in benutzerdefinierten UIViewController-Unterklassen - Und übrigens ich IB nicht verwenden) Ok, also setze ich das Self.view Mitglied in - (void) loadView, und dann erstelle ich meine Steuerelemente und Ansichten und was auch immer in - (void) viewDidLoad, und füge sie dann der Unteransicht hinzu. Wenn die Steuerung nicht Mitglied ist, wenn ich es schaffen und lassen Sie sie lokal in dem Verfahren, das ist, wie ich es tun: (Mit einem UILabel)iPhone Dev - Welchen Weg sollte ein Mitglied als Unteransicht hinzugefügt werden

- (void)viewDidLoad { 
    UILabel *localLabel = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)]; 
    localLabel.text = @"I'm a Label!"; 
    localLabel.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
            UIViewAutoresizingFlexibleRightMargin | 
            UIViewAutoresizingFlexibleBottomMargin); 

    [self.view addSubview:localLabel]; 
    [localLabel release]; 
    [super viewDidLoad]; 
} 

Das ist nur ein Beispiel dafür, wie ich schaffen würde Beschriften Sie lokal, legen Sie seine Eigenschaften fest, fügen Sie sie zur Unteransicht hinzu und veröffentlichen Sie sie. Aber mit einem Mitglied, das tue ich dies:

UILabel *lblMessage; 
... 
@property (nonatomic, retain)UILabel *lblMessage; 
... 
- (void)viewDidLoad { 
    UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)]; 
    localMessage.text = @"I'm a Label!"; 
    localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
             UIViewAutoresizingFlexibleRightMargin | 
             UIViewAutoresizingFlexibleBottomMargin); 
    self.lblMessage = localMessage; 
    [localMessage release]; 

    [self.view addSubview:lblMessage]; 
    [super viewDidLoad]; 
} 

Aber ich habe es auch getan

... 
- (void)viewDidLoad { 
    UILabel *localMessage = [[UILabel alloc] initWithFrame:CGRectMake(81, 384, 148, 21)]; 
    localMessage.text = @"I'm a Label!"; 
    localMessage.AutoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
             UIViewAutoresizingFlexibleRightMargin | 
             UIViewAutoresizingFlexibleBottomMargin); 
    self.lblMessage = localMessage; 

    [self.view addSubview:localMessage]; 
    [localMessage release]; 
    [super viewDidLoad]; 
} 

in meinem Anfang iPhone 3 Entwicklung so gesehen: das sdk Buch zu erkunden. Beachten Sie, dass Sie die lokale Variable hinzufügen und dann freigeben. Was soll ich tun? Spielt es überhaupt eine Rolle?

Antwort

1

Wenn lblMessage eine Halteeigenschaft ist (was oft der Fall ist), dann gibt es keinen funktionalen Unterschied. Andernfalls ist der Release-before-addSubview-Fehler ein Fehler, da er versucht, ein freigegebenes Objekt als Unteransicht hinzuzufügen.

Hier ist ein kurzer Durchmarsch der Referenzzähler auf localMessage, die Eigenschaft, unter der Annahme, lblMessage wird beibehalten:

UILabel *localMessage = [[UILabel alloc]... // retainCount is now 1 
// Set up localMessage. If you release'd now, you'd dealloc the object. 
self.lblMessage = localMessage; // retainCount is now 2 
// You can safely call release now if you'd like. 
[self.view addSubview:localMessage]; // retainCount is now 3. 
[localMessage release]; // retainCount is now 2. 

Sie wollen die retainCount bei 2 zu beenden, da Sie effektiv auf das Objekt 2 Referenzen haben - Ihr Mitglied Zeiger lblMessage, und ein anderer Haltezeiger in self.view.

0

Das Label, das ein Mitglied ist, und das lokale Scope-Label sind Verweise aufeinander, so dass sie dasselbe Objekt sind. Es spielt also keine Rolle, wie Sie es tun. Ich würde das Local nicht direkt initialisieren

+0

Ich muss das lokale erstellen, da lblMessage eine beibehaltene Eigenschaft ist, also self.lblMessage = [[UILabel alloc] initWithFrame: ..]; würde die Obj Referenz 2. – mk12

+0

Ur-Anweisung in nicht genau machen, wird der Count noch eins sein Ich Blive – Daniel