2016-07-01 15 views
2

Lernziel und Swift im Moment. Ich verstehe Initialisierer in Obj C und Convenience Initialisierer und ich verstehe Factory-Methoden. Ich habe auch den Begriff "Konstrukteure" gehört, aber ich bin nicht sicher, wie sie sich von Fabrikmethoden oder Initialisierern unterscheiden. Ist "Konstruktor" nur eine andere Möglichkeit, auf Initialisierer Bezug zu nehmen? dankeUnterschied zwischen Fabrik Methoden und Konstruktoren

Antwort

3

Es gibt keinen Unterschied.

Klassenmethoden, die Instanzobjekte erstellen, wurden lange als Convenience Allokatoren oder - selten - als Konstruktoren bezeichnet. Der Begriff Convenience Allokatoren wurde oft verwendet, wenn ein Instanzobjekt automatisch freigegeben wurde, was mit ARC unwichtig wurde.

NSString *string1 = [NSString string]; // autoreleased 
NSString *string2 = [NSSString new]; // ownership transfer 

Grundsätzlich sind sie eine Kombination aus +alloc und -init… plus - wenn es sich um eine Bequemlichkeit Allocator ist - -autorelease. Vor zwei (?) Jahren begannen sie, sie als Faktormethoden zu bezeichnen.

Allerdings Namen vergessen. Denken Sie darüber nach, was sie tun und warum sie existieren: Mit einer klassischen +alloc - -init… Kombination hatte die Klasse keine Möglichkeit zu entscheiden, welcher Subtyp erstellt werden soll, denn das hängt von den Argumenten -init ab. Nehmen wir ein Beispiel: NSSArray hat zwei (private) Unterklassen _NSSmallArray und _NSBigArray. Er möchte den Subtyp aus der geschätzten Größe auswählen, die Sie als Kapazität auf einer -initWithEstimatedSize:-Methode angeben. Wie kann +alloc entscheiden, welcher Subtyp ausgewählt und zugeordnet wird? Es hat keine Ahnung, welches Argument Sie der init Methode übergeben werden.

Mit Konstruktoren oder Komfortzuweisern kann die Objektzuordnung parametrisiert werden. +newArrayWithEstimatedSize: oder +arrayWithEstimatedSize: kann dieses Problem lösen.

Eh, jetzt müssen Sie sie Fabrikmethoden nennen. Es tut uns leid. Die Geschichte ist die gleiche.

+0

Dies ist getaggt mit [swift], nicht wirklich klar, ob OP tatsächlich nach Swift-Informationen gesucht hat, aber vielleicht sollte erwähnt werden, dass Swift den Begriff "convenience _initializer_" formalisiert hat (https://developer.apple.com/library /prelelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID216) und "Initialisierer" in Swift decken die Funktionalität ab, für die "Konstruktoren" in ObjC verwendet werden . –

+0

Es ist mit Swift und Objective-C markiert. Da das Konzept in Swift von Objective-C abgeleitet ist, können Sie es mit Objective-C beschreiben. Der Rest ist wie in den letzten drei Absätzen erwähnt. –