Ich möchte zeigen, und zeigt einige Beispiele, wie man hinzufügen und manipulieren Eigenschaften in Objective-C-Klasse. : Ein klassisches Beispiel, genau, ist wie folgt: bei der Definition der Schnittstelle unserer Klasse definieren wir zwei Eigenschaften nome und cognome :
1 2 3 4 5 6 7 8 9 10 11 |
e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: In der Implementierung-Datei fügen wir die Anweisung @synthesize so dass Xcode für uns produzieren wird den Methoden getter -und setter bzw. verwendet werden, um lesen und setzen unsere zwei Eigenschaften:
1 2 3 4 5 6 7 8 | / / MyClass.m # Import "MyClass.h" @ Implementation MyClass @ Synthesize Name, Vorname; @ End |
, possiamo scrive: Wenn Sie gehen zu unserer Klasse verwenden, MyClass , dh wenn istanziaremo ein Objekt vom Typ MyClass , können wir schreiben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | / / Jede andere Klasse, als AppDelegate / / In der Datei. H # Import <UIKit/UIKit.h> # Import "MyClass.h" @ Klasse TestViewController; NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate> UIWindow * Fenster; * TestViewController viewController; MyClass * MyClass; } / / In der Datei. M MyClass alloc ] ; myClass = [MyClass alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome); |
Oder, was äquivalent:
1 2 3 | / / Immer in der Datei. M @ "Undolog" ] ; [SetNome MyClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]); |
So weit so gut. Allerdings könnte es Irreführung der Gleichwertigkeit der "variabli" interne (ivar) als Immobilien. Um den Unterschied zu verstehen, noch einmal vorschlagen, das gleiche wie der Verzicht, diese Zeit der @synthesize . . Nun, deshalb sollten wir mit uns zu tun, um die Methoden zu schreiben getter und setter . Zur weiteren betonen die Unterschiede, die internen Variablen rinominerò Einfügen einen Unterstrich vor dem Namen. Aber wir sehen den Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # Import <Foundation/Foundation.h> NSObject { @ Interface MyClass: NSObject { _nome; NSString * _Name; _cognome; NSString * _cognome; } NSString * ) nome; // get - ( NSString *) name; / / get NSString * ) cognome; // get - ( NSString *) name; / / get void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set @ End |
. Im Gegensatz zum vorherigen Beispiel die Zeiger auf die internen Variablen (incapsultate) geworden _nome und _cognome . . @property è scomparso, in quanto non serve più. Darüber hinaus gibt es vier Verfahren, die unseren Definitionen repräsentieren get und set . @property ist verschwunden, als nicht mehr benötigt.
Wir sehen die Umsetzung Datei MyClass.m :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # Import "MyClass.h" @ Implementation MyClass / / Holen Sie sich einen "Namen" NSString * ) nome { - ( NSString *) name { _Name Rückkehr; } / / Um "name" Set void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso _Name = StringaIngresso; } / / Für "Nachname" Get NSString * ) cognome { - ( NSString *) name { _cognome zurückkehren; } / / Auf "Nachname" Set void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
Eine Klasse kann genau so geschrieben wie der vorherige, also verwendet werden:
1 2 3 4 5 6 7 8 | MyClass alloc ] ; myClass = [MyClass alloc]; "Giovambattista" ; miaClasse.nome @ = "Giovambattista"; "miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome); / / Oder, was äquivalent: @ "Undolog" ] ; [SetNome MyClass: @ "Undolog"]; "miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]); |
e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Auf der Ebene der pädagogischen Vernachlässigung @synthesize zwang uns zu schreiben "ihre eigenen" Methoden get und set , Hervorhebung - auch mit dem Zusatz dell'underscore - die Unterschiede zwischen dem Namen der Eigenschaft und ihre internen Ivar _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. Auf funktionaler Ebene der persönliche Einsatz der Methoden get und set ermöglicht Echtzeit-Steuerung der Daten vor ihrer Einstellung (oder vor seiner Lesung) und dann eine echte Kapselung, um die interne Variable zu schützen.
Zum Beispiel, wäre es möglich, um den Durchgang von leeren Zeichenketten dem Eigentum zu verhindern nome :
1 2 3 4 |
Weitere Variante
Wenn Sie die internen Variablen mit einem Unterstrich vor (wer rpoviene Adobe ActionScript könnte auch verwendet werden) nutzen wollen ist nicht notwendig, die Verwendung der Richtlinie aufzugeben @synthesize . Xcode macht es möglich, "verschmelzen" die oben genannten Methoden:
1 2 | _nome; @ Name = _Name synthetisieren; _cognome; @ Name = _cognome synthetisieren; |
. Dabei haben wir intern verwenden könnten Zeiger _nome ", resümierte" - nach außen - als eine Eigenschaft nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . Auch wenn die Verwendung von @synthesize produziert automatische Generierung Methoden (Nachrichten) von getter und setter , ist auch wahr, dass sie das tut nur wenn er sie findet, wenn Sie so wollen, um "implementieren" eine Methode für Ihre getter und / oder setter können dies tun, auch wenn Sie die Richtlinie verwendet @synthesize .
Speicherzuordnungen
In den obigen Beispielen habe ich einige wichtige Details für eine reale Umsetzung verzichtet. Zunächst einmal habe ich keine Methode gezeigt init() , nützlich für die Initialisierung des Objektes und Standardwerte. Außerdem ist es nicht die Zugabe von ein Verfahren dealloc() :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | / / File MyClass.m # Import "MyClass.h" @ Implementation MyClass id ) init { - (Id) init { self = [ super init ] ) { if (self = [super init]) { "Nome preimpostato" ; _Name @ = "Name der Voreinstellung"; "Cognome preimpostato" ; _cognome @ = "Name der Voreinstellung"; } Selbst zurückkehren; } void ) dealloc { - (Void) {dealloc ; [_Name Release]; ; [_cognome Release]; ; [Super dealloc]; } NSString * ) nome { - ( NSString *) name { _Name Rückkehr; } void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name"; _Name = StringaIngresso; } NSString * ) cognome { - ( NSString *) name { _cognome zurückkehren; } void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
, etc… In Zukunft werden wir dann sehen, die Details zu den Eigenschaften readonly , retain , etc ... ![]()






Neueste Kommentare
Mark : Vielen Dank, ich habe angezündet
Ich löste es, indem Sie [cc_objc] / / OptionViewController.m - ...
Giovambattista Fazioli : @ Mark: Ich schlage vor, Sie denken, ein richtiger Ansatz. Wenn Sie das Unterklasse der Registerkarte ...
Mark : Entschuldigen Sie die Spam .. Ich bemerkte, dass es einen Fehler .. hier ist die Korrektur [cc_objc] / PrimaClasse.h **** / # import ...
Marco : vergessen .. in [IHK] OptionViewController [/ CCI] für [IHK] @ syntetize [/ CCI] Ich legte den Delegierten
Louis : sehr klar und einfach ich muss zugeben, dass das Schreiben eines pa kaum Delegaten verwenden, erstellt von ...