Frage

Ich bin zu modifizieren QuartzDemo Beispiel app und will Satz zu tun, und die Werte der Integer-Typ-Variablen in anderen Klassen zu lesen, die bereits enthalten sind.

Zum Beispiel in MainViewController.m Ich möchte einen numerischen Wert (einfache Zahlen von 1 bis 100) auf eine Variable, die dann aufgerufen werden soll (Lesen) in der Datei QuartzImages.m.

Die Frage ist, wie variabel zu definieren richtig, Satz und Zugriff (Lesen) der Wert.

Ich bin ein Anfänger mit Obj C und iPhone SDK im Allgemeinen und habe einige Erfahrung mit Delphi und VB, aber dies nicht hilft überhaupt:)

Danke, wer auch immer und wo immer Sie sind, wer wird mich diese endlosen googeln Schleife aus.

War es hilfreich?

Lösung

Wenn Sie eine Variable haben, gibt es zwei Möglichkeiten, und die festgelegten Eigenschaften zu lesen (die in der Regel eine Kombination aus einem Ivar und Accessormethoden). Der alte Weg (noch von einigen bevorzugt) ist, direkt auf die Zugriffsmethoden zu verwenden:

//MYObject *obj, with int property foo
int i = [obj foo]
[obj setFoo:32]

Die neue Art und Weise verwenden Punkt-Syntax (das nur für Eigenschaften arbeitet, und kann nicht mit komplizierteren Methoden verwendet werden):

int i = obj.foo //equivalent to [obj foo]
obj.foo = 32 //equivalent to [obj setFoo:32]

Wenn du das bist verwirrend, würde ich sehr eine Kopie Aaron empfehlen Abholung Hillegass Buch . Es wird erläutert, Cocoa und Objective-C im Detail.

EDIT: Ich denke, einige der Verwirrung hier mit Terminologie ist. In Objective-C, die meisten Objekte haben Instanzvariablen (ivars), die tatsächlich Daten speichern. im Allgemeinen Sie mögen jedoch ivars direkten Zugriff, insbesondere von anderen Objekten zu vermeiden. (Dies ist ein Prinzip des objektorientierten Designs und ist nicht wirklich spezifisch für Objective-C.)

Der Hauptgrund dafür ist, die Flexibilität zu erhöhen - wenn ich eine Klasse Person habe, die eine Instanz Variable age hat, zum Beispiel, kann ich möchte, dass meine Umsetzung in der Zukunft ändern, um dynamisch das Alter zu bestimmen. Wenn andere Klassen auf dem Instanzvariable age verlassen, bricht sie, wenn die Implementierung ändert.

Die Art und Weise, um dieses Problem ist die Verwendung Accessoren, die sind Methoden, die den Zugriff auf eine Ivar. In Objective-C, „Getter“ erhalten Sie die Variable, und sind in der Regel die gleiche Sache wie die Variable mit dem Namen und „Setter“ setzen Sie die Variable (es würde genannt Person) (so im -(int)age Beispiel würde der Getter -(void)setAge:(int)theAge sein). Wenn Sie Accessoren verwenden, können Sie frei Ihre Umsetzung in der Zukunft ändern, auch den Ivar loszuwerden vollständig, wenn nötig, ohne angewiesen Klassen zu brechen.

In Objective-C, die Kombination eines Ivar und Accessoren wird oft als „Eigentum“ genannt (obwohl hat es nicht nötig habe ein Ivar sein, wenn der Wert dynamisch erstellt wird). Wenn Sie in Bezug auf die Eigenschaften denken, haben Sie keine Sorgen zu machen über ivars in anderen Klassen - sie sind Implementierungsdetails. Objective-C 2.0 hat einigen schönen syntaktischen Zucker für die Erstellung von Eigenschaften:

//Person.h
@interface Person : NSObject {
    int age;
}

@property (assign) int age;  //declares the accessors

@end

//Person.m
@implementation Person

@synthesize age; //implements -(int)age and -(void)setAge:theAge

@end

Die wichtige Sache zu erinnern ist, die meiste Zeit, die Sie in Bezug auf die Eigenschaften denken sollte, anstatt ivars. Sie sollten sich nicht direkt zugreifen ivars in anderen Klassen. Sie sollten nur selten (wenn überhaupt) Zugang ivars in Oberklassen. Wenn Sie ein Purist sind, sollten Sie nicht einmal direkt Zugang ivars in der gleichen Klasse außer in Accessoren, init und dealloc (und die beiden letzteren unterliegen Aussprache).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top