Am văzut următoarea bucată de cod:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Care este relația între mapView " și " mapView1
?
Nu creează un " set " și "a lua" metodă pentru mapView1`?
În exemplul tău, mapView1
e un exemplu de variabilă (ivar), o bucată de memorie de stocare de care aparține o instanță a clasei definite în exemplu.h " și " exemplu.m.
mapVieweste numele unui *proprietate*. Proprietățile sunt atribute ale unui obiect care poate fi citit sau pentru a seta folosind notația punct:
myObject.mapView. O proprietate nu't *au* să se bazeze pe o ivar, dar cele mai multe proprietăți sunt. La
@proprietate'declaration pur și simplu spune lumii că există o proprietate numita play
.
@sintetiza mapView = mapView1;
Această linie spune compilator pentru a crea un setter și getter pentru play
, și că acestea ar trebui să utilizeze ivar numit mapView1
. Fără = mapView1
parte, compilatorul ar presupune că proprietatea și ivar au același nume. (În acest caz, care ar produce o eroare de compilator, deoarece nu există nici ivar numit play
.)
Rezultatul acestei `@sintetiza declarația este similară dacă ai adaugat acest cod de tine:
-(MKMapView *)mapView
{
return mapView1;
}
-(void)setMapView:(MKMapView *)newMapView
{
if (newMapView != mapView1)
{
[mapView1 release];
mapView1 = [newMapView retain];
}
}
Dacă adăugați codul pentru clasa de unul singur, puteți înlocui `@sintetiza declarația cu
@dinamic mapView;
Principalul lucru este de a avea o foarte clară distincție conceptuală între ivars și proprietăți. Ele sunt într-adevăr două concepte foarte diferite.
`@sintetiza creează un getter și setter pentru variabila.
Acest lucru vă permite să specificați anumite atribute pentru variabile și când [email protected] că proprietatea de a variabilei genera getter și setter pentru variabila.
Numele proprietății poate fi la fel ca numele variabilei. Uneori, oamenii doresc să fie diferite, astfel încât să-l folosească în init " sau " dealloc
sau când parametrul este trecut cu aceeași variabilă's nume.
De documentația:
utilizați @sintetiza cuvânt cheie pentru a spune compilatorului că ar trebui să sintetizeze setter și/sau getter pentru proprietate, dacă nu le furnizează în @implementarea bloc.
Cum am rula în această problemă atunci când editarea cod moștenire vreau să fac note suplimentare la cele existente răspunsuri unul trebuie să fie conștienți de.
*Chiar și cu un compilator mai nou versiune uneori nu face o diferență dacă omiteți `@sintetiza propertyName sau nu**.
În cazul declara o variabilă de exemplu without subliniere în timp ce încă sintetizarea acesteia, cum ar fi:
Antet:
@interface SomeClass : NSObject {
int someInt;
}
@property int someInt;
@end
Implementare:
@implementation SomeClass
@synthesize someInt;
@end
de sine.someInt
va accesa aceeași variabilă ca someInt
. Nu utilizați un lider de subliniere pentru ivars nu respectă convențiile de denumire, dar am venit într-o situație în care a trebuit să citesc și să modifice astfel de cod.
Dar dacă acum crezi că "Hei, @sintetiza nu mai este important ca noi folosim un compilator mai nou" te înșeli! Clasa dvs., atunci va rezulta în a avea două ivars, și anume someInt
plus un autogenerat _someInt
variabil. Astfel de sine.someInt " și " someInt
nu va aborda aceleași variabile de orice mai mult. Dacă tu nu't aștepta la un astfel de comportament ca am facut acest lucru s-ar putea obține unele dureri de cap pentru a afla.
Ca pe apple documentare @Sintetiza este folosit doar pentru a redenumi variabile de instanta. De exemplu
@property NSString *str;
@synthesize str = str2;
Acum in clasa nu se poate folosi _strca linia de mai sus a redenumește variabilă de exemplu la
str2`
`@o proprietate permite obiectelor să fie utilizate de către obiecte în alte clase, sau în alte cuvinte face obiectul publică.
Atunci când creați o proprietate în @interfață, că proprietatea va fi în mod automat înapoi de către o instanță variabilă numit _propertyName. Deci, atunci când creați o proprietate numit firstName, în spatele scenei compilatorul va crea o variabilă de exemplu nume ca _firstName în mod implicit. Compilatorul va crea, de asemenea, getter și setter metoda pentru tine(de exemplu, prenumele, setFirstName).
Acum, când sintetiza proprietatea de @sintetiza firstName, sunt pur și simplu spune compilatorului redenumiți-mi exemplu de variabilă(_firstName) de prenume. Dacă doriți să redenumiți susținute exemplu de variabilă de către diferite nume, puteți pur și simplu atribui diferite nume, în timp ce sintetizează numele proprietății(de exemplu, @sintetiza firstName = myFirstName), prin aceasta proprietatea este susținută de o variabilă instanță numit myFirstname.
Deci, pe scurt, cele mai multe ori @sintetiza folosit pentru a redenumi variabilă de exemplu susținute de proprietate.
A se vedea apple docs
Practic sintetiza creează o setMapView și mapView metode care a stabilit și a obține mapView1
Se creează getter și setter pentru obiect. Puteți accesa cu ceva de genul asta :
MKMapView* m = object.mapView;
sau
object.mapView = someMapViewObject
mapView1 este numele ivar în clasă, mapView este numele pentru getter / setter metoda(metodele).