Ich möchte zeigen und diskutieren einige Beispiele, wie man hinzufügen und manipulieren Eigenschaften in Objective-C-Klasse. : Ein klassisches Beispiel, genau, ist die folgende, in der Definition unserer Interface-Klasse definiert 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 die Anweisung einfügen @synthesize , so dass Xcode für uns produzieren werden die Methoden getter -und setter bzw. zum 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 du gehst, um unsere Klasse MyClass , dass, wenn istanziaremo ist 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" @ Class TestViewController; NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate> UIWindow * window; * 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 ist das äquivalent zu:
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 eine Irreführung der Gleichwertigkeit der "variable" interne (ivar) mit dem Namen des Immobilien-Objekt selber. Um zu verstehen, der Unterschied, wieder schlagen die gleiche wie Verzicht, dieses Mal, die @synthesize . . Nun, deshalb sollten wir darauf achten, dass die Methoden zu schreiben getter und setter . Zur weiteren betonen die Unterschiede, werden die internen Variablen durch Einfügen eines vor dem Namen unterstreichen umzubenennen. 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 Zeiger auf interne Variablen (incapsultate) geworden _nome und _cognome . . @property è scomparso, in quanto non serve più. Darüber hinaus gibt es vier Definitionen von Methoden, die unsere 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 Return; } / / Um "name" Set void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso _Name = StringaIngresso; } / / Für "Nachname" Get NSString * ) cognome { - ( NSString *) name { _cognome return; } / / Für "Nachname" Set void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
Geschrieben als eine Klasse genau wie die vorherigen genutzt werden können, nämlich:
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 gleichbedeutend ist mit: @ "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" Methoden get und set , Hervorhebung - auch mit dem Zusatz dell'underscore - die Unterschiede zwischen den 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 der funktionalen Ebene der persönlichen Nutzung der Methoden get und set ermöglicht Echtzeit-Steuerung der Daten vor ihrer Einstellung (oder vor seiner Lesung) und dann eine echte Kapselung der internen Variablen zu schützen.
Zum Beispiel wäre es möglich, den Durchgang der leeren Saiten, um eine Immobilie zu verhindern nome :
1 2 3 4 |
Weitere Variation
Wenn Sie die internen Variablen mit dem verwenden möchten unterstreichen vor (wer rpoviene Adobe Actionscript könnte auch verwendet werden) ist nicht notwendig, die Verwendung der Richtlinie aufzugeben @synthesize . Xcode macht es möglich, "merge" den oben genannten Verfahren:
1 2 | _nome; @ Synthesize name = _Name; _cognome; @ Synthesize name = _cognome; |
. Dabei haben wir den Zeiger auf die intern verwenden könnten _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 . Außerdem, es ist wahr, dass die Verwendung von @synthesize automatische Generierung Methoden (Nachrichten) von produziert getter -und setter ist es auch wahr, dass, wenn er sie nicht findet, so, wenn Sie "implementieren" eine Methode für Ihren gewünschten getter -und / oder setter können Sie dies tun, auch wenn Sie der Richtlinie verwendete @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. Darüber hinaus gibt es die Zugabe einer Methode 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 @ = "Preset Name"; "Cognome preimpostato" ; _cognome @ = "Preset Name"; } Rückkehr Selbst; } void ) dealloc { - (Void) {dealloc ; [_Name Release]; ; [_cognome Release]; ; [Super dealloc]; } NSString * ) nome { - ( NSString *) name { _Name Return; } void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "no name"; _Name = StringaIngresso; } NSString * ) cognome { - ( NSString *) name { _cognome return; } void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso _cognome = stringaIngresso; } @ End |
, etc… In Zukunft werden wir dann sehen, die Details über die Eigenschaften readonly , retain , etc ... ![]()







Neueste Kommentare
Mark : @ Mark: Danke für die Antwort. Zum Beispiel, wenn Sie einen Code zum Speichern / haben Sie die Ordner ...
Mark : Danke für die Antwort. Zum Beispiel, wenn Sie einen Code zum Speichern / haben Sie die Ordner ...
Giovambattista Fazioli : @ Mark: Im Prinzip, absolut, hängt viel ab, wie und was zum Download bereit. La ..
Mark : Hallo, guter Führer! Ich wollte fragen, können Sie den gleichen Code, um eine SQL-Datenbank laufen? Statt ...
Joseph : Hallo Ich wollte Sie fragen, wie können Sie in der Post finde ich hochgeladen einer Galerie von 50 Bildern, zum Beispiel ...