2010-08-15 13 views
7

Wenn ich eine benutzerdefinierte NSObject Klasse namens ProgramModel habe, erhält es alloc/init -ed wenn ich und @synthesize es aus einer anderen Klasse? Zum Beispiel in einer ProgramController Klasse wie diesesIst eine synthetisierte Eigenschaft bereits alloc/init -ed?

// ProgramController.h 
#import "ProgramModel.h" 
@interface ProgramController : UIViewController { 
    ProgramModel *programModel; 
} 
@property (nonatomic, retain) ProgramModel *programModel; 

// ProgramController.m 
#import "ProgramController.h" 
@implementation ProgramController 
@synthesize programModel; 
// etc 

Muss ich auch init das/Alloc in initWithNibName oder viewDidLoad, oder ist es bereits alloc/init -ed wegen der property/synthesize?

Antwort

9

Sie müssen die Eigenschaft manuell ausfüllen. Die Ausnahme ist, wenn Sie eine IBOutlet property haben, die Sie in einer NIB-Datei verbunden haben; Das wird automatisch geladen, wenn die Spitze geladen wird.

Ich finde, dass für View-Controller die überwiegende Mehrheit der Eigenschaften IBOutlets und Eigenschaften, die beschreiben, was die Ansicht anzeigen wird, und der letztere Fall wird normalerweise von dem Objekt, das den View-Controller erstellt festgelegt. Dies ist normalerweise bei einem View-Controller der Fall, der eine Detailansicht für ein Objekt anzeigt.

Wenn Sie über Eigenschaften verfügen, die für den View-Controller vollständig lokal sind, besteht ein übliches Muster darin, einen eigenen Getter und Setter zu schreiben (anstatt @synthesize zu verwenden) und das Objekt im Getter zu erstellen, falls es nicht existiert. Dieses Lazy-Loading-Verhalten bedeutet, dass Sie Ressourcen unter Bedingungen mit wenig Arbeitsspeicher problemlos freigeben können und dass Sie nur die Kosten für das Laden eines Objekts bezahlen, wenn Sie es benötigen.

// simple lazy-loading getter 
-(MyPropertyClass*)propertyName { 
    if(propertyIvarName == nil) { 
     propertyIvarName = [[MyPropertyClass alloc] init]; 
     // ... other setup here 
    } 
    return propertyIvarName; 
} 
+0

* technisch * die Steckdose ist 'nil', bis die Spitze geladen ist, was (im Falle von NSWindow/ViewController) nicht passieren wird, bis Sie' [Controller-Fenster] 'oder' [Controller-Ansicht] 'aufrufen . –

+0

Ich bin mir nicht sicher, was die Unterscheidung, die Sie zeichnen, hier ist. Ich habe gesagt "wenn die Spitze geladen ist" ... –

+0

@Seamus ja, ich wollte nur klarstellen, dass das Laden der Feder nicht unbedingt während der Initialisierung geschieht. Ich bin so oft gebissen worden, weil ich versucht habe, auf Outlets zuzugreifen, die nicht da waren, weil ich die Feder noch nicht geladen hatte. –

6

Standardmäßig werden alle Instanzvariablen auf Null gesetzt. Im Falle von Objekten bedeutet das, dass sie nil sind. Wenn Sie einen Anfangswert in der Eigenschaft möchten, müssen Sie ihn während Ihrer Initialisierer/viewDidLoad-Methode dort einfügen.

1
  • erklärt nur die Getter/Setter-Methoden.
  • @synthesize generiert nur die Accessoren für Sie.

Sie werden nicht automatisch Werte zugewiesen, abgesehen von der Nullstellung des Speichers. Außerdem müssen Sie sie in -dealloc auf Null setzen, um ein Leck zu vermeiden.

Es macht auch keinen Sinn, "eine Eigenschaft zuzuweisen". Eine Objekteigenschaft ist ein Zeiger. (Und denken Sie an, was passiert, wenn Sie eine verknüpfte Liste Klasse haben ...)

(NB: Die Eigenschaft Attribute beeinflussen auch die @synthesized Methode, und die Eigenschaften sind auch für die Laufzeit bekannt, siehe class_copyPropertyList() und Freunde .)

Verwandte Themen