@synthesize IBOutlet-Eigenschaft

8

Ich bin ein Objective-C-Neuling und lese "iPhone-Programmierung" von Alasdair Allan. Beim Lesen habe ich diesen Code gefunden:

%Vor%

Die relative Implementierung beginnt folgendermaßen:

%Vor%

Nun: Ich habe gelernt, dass @synthesize eine Art Abkürzung ist, um langweilige Getter und Setter zu vermeiden.

Aber ich habe eine Frage:

  1. im Code der Implementierung tableView wird nie explizit genannt, aber dealloc gibt es frei;
  2. wenn es nie explizit aufgerufen wird, warum @synthesize?

Ist es zwingend erforderlich, dass IBOutlets synthetisiert werden?

    
Matteo Alessani 12.07.2011, 15:09
quelle

5 Antworten

7

Von Speicherverwaltung von Nib-Objekten ,

  

Wenn eine NIB-Datei geladen und Outlets eingerichtet werden, verwendet der Nib-Lademechanismus immer Zugriffsmethoden, wenn diese vorhanden sind (sowohl unter Mac OS X als auch unter iOS). Daher sollten Sie für jede Plattform, für die Sie entwickeln, in der Regel Outlets deklarieren, indem Sie die deklarierten Eigenschaften von Objective-C verwenden.

     

Für iOS sollten Sie Folgendes verwenden:

     

@property (nicht atomisch, beibehalten) IBOutlet UIUserInterfaceElementClass * anOutlet;

     

Sie sollten dann entweder die entsprechenden Accessor-Methoden synthetisieren oder sie entsprechend der Deklaration implementieren und (in iOS) die entsprechende Variable in dealloc freigeben.

    
taskinoor 12.07.2011, 15:17
quelle
3
  

im Code der Implementierung TableView wird nie explizit aufgerufen, aber die Dealloc gibt es frei;

Das liegt daran, dass Ihr Controller, wenn Sie tun dem TableView einen Wert zuweisen, diesen beibehält und bei der Deallocation freigeben muss. Vergessen Sie nicht, @properties, die in einer Schnittstelle deklariert sind, sind öffentlich zugänglich. In Ihrem Fall wird das TableView, das Sie als IBOutlet deklarieren, von der Methode view controller loadView initialisiert, wobei die Verbindungen verwendet werden, die Sie in Interface Builder zwischen dem Eigentümer der Datei und dem UITableView definieren.

  

Wenn es nie explizit aufgerufen wird, warum @synthesize?

Sie müssen Zugriffsberechtigungen für alle angegebenen @properties bereitstellen. Sie können @synthesized sein, oder Sie könnten Ihre eigenen schreiben.

  

Ist es zwingend erforderlich, dass IBOutlets synthetisiert werden?

Nein, aber so ist es viel bequemer. Die vom Compiler erzwungene Regel lautet, dass @properties in der Implementierung über entsprechende Accessoren (synthetisiert oder nicht) verfügen muss.

    
octy 12.07.2011 15:23
quelle
2

Als Referenz: Von Xcode 4.4 und LLVM Compiler 4.0 in der @ synthesize-Direktive ist nicht mehr erforderlich, da es standardmäßig für @properties bereitgestellt wird, die in der Schnittstelle definiert sind.

    
RickP 15.08.2013 10:27
quelle
1

Wenn Sie

eingeben %Vor%

Du sagst dem Compiler: "Hör zu, es wird einen Getter und einen Setter geben. Benutze sie gegebenenfalls!" Und es wird sie benutzen, wenn die Feder geladen wird.

Daher müssen Sie den Getter und den Setter implementieren, sonst wird der Compiler beschweren.

    
dasdom 12.07.2011 15:18
quelle
0

Der Pseudo-Typ IBoutlet ist nur ein Marker, so dass der InterfaceBuilder "weiß", dass die erwähnte class-Datei ein handle / outlet für die UITableView-Instanz hat.

Beim Kompilieren wird IBOutlet vom Präprozessor entfernt (InterfaceBuilder analysiert die Quelldateien). Es ist ähnlich mit IBAction: Es wird durch den Präprozessor mit void ersetzt.

Das heißt, Sie könnten den Verweis auf diese Instanz verwenden, um programmgesteuert Dinge zu tun (wie das Hinzufügen / Ändern von Werten von UITableView)

    
das_weezul 12.07.2011 15:15
quelle

Tags und Links