Introducere in Objective C - part II

De obicei, nu accesăm variabilele unei clase direct. Ne folosim de getteri şi setteri. Însă Objective C ne scuteşte de efortul de a scrie noi getteri şi setteri. Pentru asta există directiva @property.

Cuprins

#import <UIKit/UIKit.h>
@interface Clasa
 
@property (nonatomic, strong) NSArray *array;
 
@end

Folosind @property, practic am declarat setterul şi getterul variabilei “array” de tipul NSArray. Între paranteze rotunde se pun atributele property-ului:

nonatomic - compilatorul nu trebuie să se preocupe de multithreading (opusul: “atomic”)
strong - memory management (vom discuta într-un curs viitor)
weak - memory management (vom discuta într-un curs viitor)
copy - se crează o copie în momentul atribuiri

După cum bine ştim în @interface … @end au loc declarările. Pentru implementare trebuie să folosim @implementation … @end.

Există mai multe metode de a implementa setteri şi getteri.

  1. Manual: Setteri si getteri se pot declar manual
    -(void) setArray:(NSArray *)noulArray
         {
          self.array = noulArray;
         }
     
    -(NSArray *) array
         {
          return array; 
         }
  2. Folosind directiva “@synthesize”: Aceasta implementează pentru voi automat setteri şi getteri, tot ce trebuie să scrieţi este:
    @implementation Clasa
     
    @synthesize array = _array;
     
     
     
    @end

    În acest moment, Objective C a creat setteri şi getteri.

Note: Dacă folosiți XCode 4.4 sau versiuni mai noi nu mai este necesar să scrieți @synthesize deoarece este făcut automat.

  1. Folosind directiva “@synthesize”, dar se suprascrie setterul sau getterul:
    @implementation Clasa
     
    @synthesize array = _array;
     
    -(void)setArray:(NSArray *)noulArray
     
         {
     
             if ( [noulArray count] > 5 ) _array = noulArray;
     
         }
     
    @end

Se pot suprascrie setterii şi getterii generaţi de @synthesize dacă se doreşte o implementare diferită de cea standard.

Cum ii folosim

Presupunem că avem următoarea clasă:

#import <UIKit/UIKit.h>
 
@interface Persoana
 
@property (nonatomic, strong) NSString *nume;
 
@property (nonatomic, strong) NSString *prenume;
 
@end

Implementarea setterilor si a getterilor se face prin directiva @synthesize:

@implementation Persoana
 
@synthesize nume = _nume;
 
@synthesize prenume = _prenume;
 
@end

Acum, presupunem că altcineva vrea să folosească această clasă creată de noi. La apelarea metodei de mai jos, se crează un obiect de tip Persoana si i se atribuie numele și prenumele. Acest lucru se face în felul următor:

-(void)creazaPersoanaCuNumele:(NSString*)nume siPrenume:(NSString*)prenume
{
 
   Persoana *persoana = [[Persoana alloc] init]; // se creaza obiectul
 
   persoana.nume = nume; //aici se apeleaza setterul
 
   persoana.prenume = prenume; //aici se apeleaza setterul
 
}

Prin persoana.nume = nume și persoana.prenume = prenume se apelează setter-ul. Se atribuie numele primit ca parametru variabilei “nume” din clasa noastră.

Să luăm situația următoare:

-(NSString *)returneazaNumelePersoanei:(Persoana *)persoana
{
    return persoana.nume; //aici se apeleaza getterul
}

În cazul acesta, se apelează getter-ul deoarece nu este o atribuire, ci se dorește obținerea numelui persoanei pentru a-l returna.

În concluzie:

  • setterul și getterul se apelează folosind aceași sintaxa (prin punct)

Exemplu:

persoana.nume = altNume; // setter
altNume = persoana.nume; // getter
  • setterul se apelează atunci cand este vorba de o atribuire (“cănd este în stânga egalului”)
  • getterul se apelează când se dorește obținerea valorii acelui cămp (“cănd este în dreapta egalului”)

Exercitii

  1. Adaugati inca 3 butoane in aplicatie. Realizati legaturile astfel incat la apasarea oricarui buton din cele patru sa se schimbe numarul de apasari din label.
  2. Colorati textul butoanelor in 4 culori: rosu, albastru, roz, verde.
  3. Adaugati inca 3 labeluri.
    1. Setati textul ca fiind „Numar apasari: 0“.
    2. Colorati textul din label in aceleasi culori ca cele patru butoane.
  4. Declarati un IBOutlet pentru fiecare label.
    1. Colorati textul labelurilor in aceleasi culori ca butoanele.
    2. Faceti legaturile in Storyboard astfel incat atunci cand se apasa butonul cu o culoare sa se actualizeze textul labelului care are aceasi culoare.
programare_ios/curs/curs3.txt · Ultima modificare: 2013/07/21 13:33 de către bogdan.vlad
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0