Domanda

Sto modificherò QuartzDemo esempio app e voglio fare insieme e leggere i valori delle variabili di tipo integer in altre classi che sono già inclusi.

Per esempio, in MainViewController.m voglio impostare un valore numerico (semplici numeri da 1-100) per una variabile che viene poi sta per essere chiamato (lettura) nel file di QuartzImages.m.

La domanda è come definire variabili correttamente, set e l'accesso (in lettura) il valore.

Sono un principiante con Obj C e iPhone SDK, in generale, e hanno una certa esperienza con Delphi e VB, ma questo non aiuta affatto:)

Grazie, chiunque e ovunque ci si trovi, persona che mi porterà fuori da questo ciclo googling senza fine.

È stato utile?

Soluzione

Se si dispone di una variabile, ci sono due modi per leggere e impostare le proprietà (che sono di solito una combinazione di un Ivar e metodi di accesso). Il vecchio modo (ancora preferito da alcuni) è utilizzare direttamente i metodi accessori:

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

Il nuovo modo è quello di utilizzare dot-sintassi (che funziona solo per le proprietà, e non può essere utilizzato con i metodi più complicati):

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

Se questo si è confuso, mi raccomando prendere una copia di Aaron libro di Hillegass. Spiega Cacao e Objective-C in grande dettaglio.

Modifica Penso che alcuni di confusione qui è con la terminologia. In Objective-C, la maggior parte degli oggetti hanno variabili di istanza (Ivars), che in realtà memorizzano dati. Tuttavia, in generale si vuole evitare di accedere direttamente ivars, in particolare da altri oggetti. (Questo è un principio di progettazione orientata agli oggetti, e in realtà non è specifico per Objective-C.)

La ragione principale di questo è quello di aumentare la flessibilità - se ho un Person classe che ha una variabile age esempio, per esempio, io voglio cambiare la mia applicazione in futuro per determinare in modo dinamico l'età. Se altre classi basano sulla age variabile di istanza, si romperà quando l'implementazione cambia.

Il modo per aggirare questo problema consiste nell'utilizzare di accesso, che sono metodi controllare l'accesso a un ivar. In Objective-C, "getter" ottengono la variabile, e di solito sono chiamati la stessa cosa come variabile (così nell'esempio Person, il getter sarebbe -(int)age) e "setter" impostare la variabile (che sarebbe chiamato -(void)setAge:(int)theAge). Se si utilizzano funzioni di accesso, è possibile modificare liberamente l'implementazione in futuro, anche sbarazzarsi del Ivar completamente se necessario, senza classi affidamento rompersi.

In Objective-C, la combinazione di un Ivar e di accesso è spesso chiamato una "proprietà" (anche se non ci fa necessaria deve essere un Ivar, se il valore è creato in modo dinamico). Se si pensa in termini di proprietà, non dovete preoccuparvi di Ivars in altre classi - they're dettagli di implementazione. Objective-C 2.0 ha qualche bella zucchero sintattico per la creazione di proprietà:

//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

La cosa importante da ricordare è il più delle volte, si dovrebbe pensare in termini di proprietà, piuttosto che ivars. Non si dovrebbe mai accedere direttamente Ivars in altre classi. Si dovrebbe raramente (se non mai) Ivars accesso in superclassi. Se sei un purista, non si dovrebbe nemmeno ivars direttamente accesso nella stessa classe, ad eccezione di funzioni di accesso, init, e dealloc (e gli ultimi due sono oggetto di discussione).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top