Kaj pomenita atomski
in neatomski
v izjavah lastnosti?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Kakšna je operativna razlika med temi tremi besedami?
To je razloženo v Applovi dokumentaciji, spodaj pa je nekaj primerov dejanskega dogajanja.
Upoštevajte, da ni ključne besede "atomic", če ne navedete "nonatomic", je lastnost atomična, vendar bo izrecna navedba "atomic" povzročila napako.
Če ne navedete "nonatomic", je lastnost atomična, vendar lahko v zadnjih različicah še vedno izrecno navedete "atomic", če želite.
//@property(nonatomic, retain) UITextField *userName;
//Generates roughly
- (UITextField *) userName {
return userName;
}
- (void) setUserName:(UITextField *)userName_ {
[userName_ retain];
[userName release];
userName = userName_;
}
Atomska različica je nekoliko bolj zapletena:
//@property(retain) UITextField *userName;
//Generates roughly
- (UITextField *) userName {
UITextField *retval = nil;
@synchronized(self) {
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField *)userName_ {
@synchronized(self) {
[userName_ retain];
[userName release];
userName = userName_;
}
}
V osnovi mora atomska različica prevzeti ključavnico, da se zagotovi varnost niti, poleg tega pa se poveča število referenc na objektu (in število samodejnih sprostitev, da se to uravnoteži), tako da je zagotovljeno, da objekt obstaja za klicatelja, sicer lahko pride do tekmovalnega stanja, če druga nit določa vrednost, zaradi česar število referenc pade na 0.
Dejansko obstaja veliko različnih različic delovanja teh stvari, odvisno od tega, ali so lastnosti skalarne vrednosti ali predmeti, in kako delujejo funkcije retain, copy, readonly, nonatomic itd. Na splošno sintetizatorji lastnosti preprosto vedo, kako narediti "pravo stvar" za vse kombinacije.
Atomski zagotavlja, da bo dostop do lastnosti izveden na atomski način. Npr. vedno vrača popolnoma inicializirane predmete, vsako pridobivanje/nastavljanje lastnosti v eni niti se mora končati, preden lahko druga nit dostopa do nje.
Če si predstavljate naslednjo funkcijo, ki se izvaja v dveh niti hkrati, lahko vidite, zakaj rezultati ne bi bili lepi.
-(void) setName:(NSString*)string
{
if (name)
{
[name release];
// what happens if the second thread jumps in now !?
// name may be deleted, but our 'name' variable is still set!
name = nil;
}
...
}
Prednosti : Zaradi vsakokratne vrnitve popolnoma inicializiranih objektov je to najboljša izbira v primeru večnitnega delovanja.
Slabosti : Učinkovitostni udarec, zaradi česar je izvajanje nekoliko počasnejše.
Za razliko od atomskega ne zagotavlja vsakokratnega vračanja popolnoma inicializiranega objekta.
Prednosti : Izjemno hitro izvajanje.
Slabosti : Verjetnost, da se v primeru večnitnega izvajanja pojavi vrednost smeti.
Najprej najlažji odgovor: Med vašima drugima primeroma ni nobene razlike. Privzeto so dostopi do lastnosti atomični.
Atomski dostopniki v okolju, kjer se ne zbirajo smeti (tj. pri uporabi retain/release/autorelease), bodo uporabili ključavnico, da bi zagotovili, da druga nit ne bo ovirala pravilnega nastavljanja/prevzemanja vrednosti.
Za več informacij in druge premisleke pri ustvarjanju večnitnih aplikacij glejte "Performance and Threading" poglavje Appleove dokumentacije Objective-C 2.0.