Einer der Vorteile des Property-List-Dateien, die einfach sind Textdateien, die dem XML-Standard zu folgen, ist, dass Sie sofort kann in Objekten (z. B. Array oder Wörterbuch) Objective-C umgewandelt werden. Wenn Sie eine Datei-Liste Property:

Einer der Vorteile des Property-List-Dateien, die einfach sind Textdateien, die dem XML-Standard zu folgen, ist, dass Sie sofort kann in Objekten (z. B. Array oder Wörterbuch) Objective-C umgewandelt werden. Wenn Sie eine Datei-Liste Property:

Wenn Sie in einer Umgebung, wo es unmöglich ist, die Debugging-Tools wie Nutzung entwickeln FireBug , wie dem Apple iPhone Simulator in Xcode, kann es frustrierend sein, um Probleme, darunter ein falscher Zugriff auf alle Eigenschaften eines Objekts zu finden. Hier ist, dass die Nutzung von Werken alert() von grundlegender Bedeutung ist!
In Objective-C haben wir zwei sehr zum Empfangen und Senden von Nachrichten zwischen den Klassen: Benachrichtigungen und Delegierten. Der Unterschied zwischen den beiden, abgesehen davon, auf der Ebene der Umsetzung, hängt im wesentlichen von "wie" - Objekte - können Sie eine Nachricht erhalten. Lassen Sie mich zunächst zeigen, wie das Konzept der Delegierten war geboren.
Selbst in den einfachen Tutorial finden Sie die Verwendung von Protokollen. Es wird sicherlich für viele in Ihrer View-Controller zufällig ein Protokoll verwenden, verteilen, neben der Definition der Schnittstelle, eine Anweisung ähnlich:
1 2 3 | UIViewController <uiwebviewdelegate> { @ Interface myViewController: UIViewController {<uiwebviewdelegate> ... } |
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 |
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 .
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 ... ![]()
In Post Extend MovieClip in Flash MX Ich hatte ein paar Einblicke in eine MovieClip zu verlängern. Insbesondere, sagte ich, dass die Verwendung von MovieClip.prototype nicht zulassen, dass die Erweiterung ihrer Methoden, sondern nur:
[...] Zwei wichtige Einschränkungen dieser Technik sind:
- Es kann nicht auf alle Objekte von Flash ausgesetzt angewendet werden
- Sie können "nachgeschoben" werden nur Methoden und Eigenschaften nicht [...]
In der Tat ist es möglich, mit einem zusätzlichen Schritt, auch wenn Sie dynamisch Eigenschaften hinzufügen MovieClip.prototype . , infatti, Flash permetteva l'aggiunta di proprietà (in lettura/scrittura o solo lettura) tramite il metodo addProperty() . Vor der Einführung der function get und function set , in der Tat erlaubt das Hinzufügen von Flash-Eigenschaften (read / write oder read only) über die addProperty() . In der Praxis führt dies in den Aufruf der Methode addProperty() und die Definition von zwei Getter-und Setter. Der Setter kann null , um read-only Eigenschaft zu erstellen. Zum Beispiel, wenn wir MovieClip mit einem völlig neuen Immobilie ausdehnen wollte _alpha Animation hinzugefügt werden können, schreiben Sie einfach den folgenden Code:
1 2 3 4 5 6 7 | : Number { _get_alpha function (): Anzahl { this . _alpha ) ; return (this. _alpha); } v : Number ) : Void { _set_alpha Funktion (v: Anzahl ): Void { this , "_alpha" , Strong . easeOut , this . _alpha , v , 1 , true ) ; neue Tween (this, "_alpha" Strong easeOut, diese _alpha, v, 1, true..); } prototype . addProperty ( "_alpha_tween" , _get_alpha , _set_alpha ) ; MovieClip .. Prototyp AddProperty ("_alpha_tween" _get_alpha, _set_alpha); |
Von nun an, wenn wir ein Symbol "miosimbolo_mc" haben, können wir nutzen diese neue Eigenschaft:
1 | ; miosimbolo_mc _alpha_tween = 50.; |
. Was Sie stattdessen tun, ist es, die vorhandenen Eigenschaften, weshalb ich überschreiben _alpha_tween statt _alpha . Hier ist also ein guter Grund, immer noch die 2.0-Klassen zu erweitern - und das Ergebnis - eine MovieClip.
Neueste Kommentare
Simon : Es ärgert gestört wieder ein und verwenden, die Platz für diese Dinge ... aber es funktioniert nicht ...
Giovambattista Fazioli : @ Simon: Was könnte darauf zurückzuführen sein, die Syntax, die ich verwendet, die speziell für PHP 5 +,...
Simon : Ich habe versucht gestern Abend, alles in functions.php, okay, jquery Formulare und Tabs jQueryUI ihnen ...
Giovambattista Fazioli : @ Simon: Ich empfehle Reinigung zu einem Code wie in ein ...
Simon : @ Giovambattista Fazioli: Vielen Dank für Ihre Geduld, es ist alles klar ... jetzt fühle ich mich jetzt ...