2016-04-15 10 views
1

Ich habe bereits auf @synthesize gelesen und einige wirklich gute Informationen zu dieser Frage gefunden: What exactly does @synthesize do? und ich verstehe den Unterschied zwischen einer Instanzvariablen und einer Eigenschaft, aber in dem Code, den ich geerbt habe, geht mein Problem ein wenig weiter als das und ich möchte wissen, was es tut (oder wenn es notwendig ist) unter den folgenden Umständen. Wenn mehr Code-Kontext benötigt wird, fragen Sie einfach.Was wird @synthesize tun, wenn "get" implementiert wird?

// example.h 
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;  

// example.m 
@synthesize managedObjectContext = _managedObjectContext; 

//... later on in example.m 
- (NSManagedObjectContext *)managedObjectContext {   
    if (_managedObjectContext != nil) { 
     return _managedObjectContext; 
    } 

    _managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    return _managedObjectContext; 
} 

im Beispiel also aus der verknüpften Antwort MapView und MapView1 sowohl während in der .h-Datei definiert wurden in meinem Beispiel ein Zeiger auf _managedObjectContext ist nie so weit definiert, wie ich nachdem ich eine globale Suche berichten. Wir verwenden es mit dem Schlüsselwort @synthesize sowie eine konkrete Definition von managedObjectContext in der Implementierungsdatei.

So ist meine Frage 2 wirklich:

  1. Ist @synthesize noch etwas hier?
  2. Warum kompiliert es immer noch, wenn _managedObjectContext nicht wie in der anderen Beispielfrage definiert ist?

Antwort

3
  1. Nein, wie Sie den Getter für die Eigenschaft zur Verfügung gestellt haben.
  2. Da die Eigenschaft eine Standard-Backing-Instanzvariable namens _managedObjectContext bereitstellt.

Hinweis: Es gibt keine Notwendigkeit zu @synthesize in all diesen Tagen.

+0

Also, wenn ich eine Eigenschaft 'ManagedObjectContext' deklariere, erstellt der Compiler automatisch ein Ivar namens '_managedObjectContext'? In meinem Beispiel könnte ich einfach die 'managedObjectContext'-Implementierung als 'return [[NSManagedObjectContext alloc] init];} schreiben und der Compiler kümmert sich um den Rest? Gibt es irgendwelche Arten von Speicherlecks, über die ich mir Sorgen machen sollte? – akousmata

+0

@akousmata Nun, nicht ganz so wie Ihr Getter ist etwas Besonderes. Ich denke, du solltest es ablegen und dieses Objekt stattdessen in der 'init'-Methode zuweisen. Viel konventioneller. – trojanfoe

+0

Ich werde versuchen, das zu untersuchen, ich bin mir nicht sicher, ob ich das kann, ohne einen Haufen anderer Dinge zu brechen. Danke für die Information. Immer noch ziemlich neu bei iOS – akousmata

0

Im heutigen Rahmen müssen Sie nicht @synthesize. Property wird automatisch durch das Framework synthetisieren.

+1

Dies beantwortet die Frage nicht. Ich würde auch auf das Wort "Framework" achten, da es eine besondere Bedeutung in der Objective-C-Programmierung hat. – trojanfoe

+0

yeah, du hast recht ich denke. Ich habe ein falsches Wortrahmen verwendet. aber ich habe in anderem Sinne gesprochen. Ich bin kein gemeiner Rahmen im Rahmen von Ziel c. !! – Lion

+0

Wie oben erwähnt, ist diese Antwort nicht hilfreich und falsch. -1. –