#import "Fraction.h" #import <stdio.h> @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator: d]; } return self; -(void) print { printf( "%i/%i", numerator, denominator ); } -(void) setnumerator: (int) n { numerator = n; } -(void) setdenominator: (int) d { denominator = d; } -(void) setnumerator: (int) n anddenominator: (int) d { numerator = n; denominator = d; Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) Wykład 2
Unikalne nazwy klas wewnątrz aplikacji Aplikacji / użytych frameworków / całego Objective-C Prefiksy 2
Nazewnictwo klas Własne klasy 3 literowe prefiksy. RAB - Rovio, aplikacja Angry Birds UPZ - UMK, aplikacja Planer Zajęć Reszta jasno ma pokazywać co klasa reprezentuje RABAnimation UPZTable 3
Nazwy metod Jasne znaczenie i unikalne nazwy wewnątrz klas. stringafterfindingandreplacingalloccurrencesoft hisstring:withthisstring: strreplacingstr:str: stringbyreplacingoccurrencesofstring:withstring: 4
Zmienne Unikalne wewnątrz tego samego zakresu int interestingnumber = 42; int interestingnumber = 44; int interestingnumber = 42; { int interestingnumber = 44; } 5
Nazwy metod zgodne z konwencją Przy tworzeniu klasy zgodnej z protokołem Przy tworzeniu metod typu getter i setter Tworzenie obiektów Alloc + init new Metody fabrykujące 6
Właściwości obiektu Ustawianie i pobieranie stanu właściwości obiektu z wykorzystaniem syntaktyki. -(type)propertyname -(void)setpropertyname:(type) 7
Właściwości zadeklarowane Składnik klasy posiadający cechy pola i metody Sposób na zastąpienie deklaracji i implementacji metod get i Set Deklaracja @property w interfejsie klasy. Typ, nazwa, zachowanie 8
Właściwości zadeklarowane Każda właściwość specyfikuje metody o nazwach: nazwawlasciwosci (odczyt) setnazwawlasciwosci: (zapis) 9
Właściwości zadeklarowane W implementacji klasy należy użyć dyrektywy kompilatora @synthesize, aby wygenerować te metody. 10
Właściwości zadeklarowane Oszczędzają czas Ułatwiają stworzenie metod typu pobierz/ustaw 11
Zachowanie właściwości readonly - readwrite @property (getter=isfinished) BOOL finished; 12
Zachowanie właściwości @property (atomic) NSObject Metody getter / setter zapewniają, że operacje na tych właściwościach będą wykonane atomowo, w przypadku jednoczesnego wywołania z różnych wątków nonatomic pobieranie i ustawianie bez gwarancji. 13
Właściwości (Properties) Standardowo atomic atomic nie znaczy bezpieczny dla wątków. 14
Lazy accessor Opóźnienie inicjalizacji obiektu Praca z własną instancją zmiennej Jeśli kompilator sam generuje którąkolwiek z metod dostępowych, to generuje również tą zmienną. Jeśli nie, to sami jesteśmy odpowiedzialni za tą zmienną. 15
Przechowywanie obiektów Na stosie Tak długo, dopóki mamy do nich dostępne wskaźniki. 16
Przechowywanie obiektów 17
Przechowywanie obiektów 18
Przechowywanie obiektów 19
Silne referencje 20
Silne referencje 21
Słabe referencje Słaba referencja nie implikuje własności i odpowiedzialności między obiektami i nie utrzymuje takiego obiektu przy życiu. 22
Słabe referencje Słaba referencja nie implikuje własności i odpowiedzialności między obiektami i nie utrzymuje takiego obiektu przy życiu. 23
Deklarowanie właściwości Domyślne Atrybut strong jest domyślny Słabe 24
Lokalne zmienne Również są domyślnie strong Zmienna zachowuje silną referencję tak długo Aż jest dostępna w zasięgu widoczności. Aż zostanie wykonane przypisanie nowego obiektu albo nil. 25
Zmienne lokalne słabe Taką zmienną można również zadeklarować jako zmienną słabą. Istnieje szansa, że obiekt może zostać usunięty z pamięci (jeśli zostaną usunięte do niego referencje silne. Wówczas zmienna jest ustawiana na nil. 26
Zmienne lokalne słabe Do zmiennej jest jakaś silna referencja Obiekt zostanie usunięty po usunięciu silnej referencji Do zmiennej nie ma silnej referencji Obiekt zostanie usunięty od razu po zaalokowaniu. 27
(copy) Aby Właściwość była zawsze przechowywana w silnej własnej kopii (strong) 28
(copy) Obiekt, który przypisywany do zmiennej takiej właściwości musi Być zgodny z protokołem NSCCopying czyli dać się skopiować 29
Protokoły Deklarują metody, które mogą być zaimplementowane przez klasę. Deklarują interfejs Klasa może być zgodna z Protokołem poprzez implementację zadeklarowanych w nim metod. Przykład: Używane do implementowania metod potrzebnych w obiektach wykorzystywanych później do różnych celów (np. delegaty) 30
Protokoły Deklaracja, że klasa będzie implementowała / będzie zgodna z protokołem Odpowiednie metody muszą być zdefiniowane 31
Deklaracja protokołu Nie ma zmiennych instancji Nie mają klasy bazowej 32
Deklaracja użycia protokołu Obiekt może być klasy dowolnej Ale musi być zgodny z protokołem! 33
Deklaracja protokołu Mogą specyfikować metody wymagane i opcjonalne. 34
Użycie metody opcjonalnej W przypadku chęci skorzystania z metody opcjonalnej, należy sprawdzić, czy obiekt ją implementuje 35
Dziedziczenie protokołów Protokoły mogą dziedziczyć, Tzn. Jeden protokół musi być musi być zgodny z drugim. 36
Modyfikacja istniejących klas Dodanie metody do istniejącej klasy Użycie kategorii Nawet jeśli nie mamy dostępu do implementacji klasy oryginalnej Nie ma różnicy w stosunku do standardowo zmodyfikowanego kodu implementacji klasy. 37
Deklaracja kategorii XYZPerson+XYZPersonNameDisplayAdditions.h 38
Implementacja kategorii XYZPerson+XYZPersonNameDisplayAdditions.m 39
Użycie kategorii.m 40
Kategorie a nazewnictwo metod Nie jest zdefiniowane która metoda zostanie wykonana, jeśli nazwy metod powtórzą się w obrębie Klasy - Kategorii Kategorii 1 - kategorii 2 Należy uważać, szczególnie przy tworzeniu metod dla klas obcych. Problem również w przypadku kompilacji kodu z nowszymi wersjami Klas frameworków. 41
Kategorie a nazewnictwo metod Nie jest zdefiniowane która metoda zostanie wykonana, jeśli nazwy metod powtórzą się w obrębie Klasy - Kategorii Kategorii 1 - kategorii 2 Należy uważać, szczególnie przy tworzeniu metod dla klas obcych. Problem również w przypadku kompilacji kodu z nowszymi wersjami Klas frameworków. 42
Rozszerzenia klas Kategorie anonimowe Deklarowane w bloku implementacji oryginalnej klasy. 43
Rozszerzenia klas Pozwalają na dodanie do klasy własnych właściwości i zmiennych instancji Deklarowane w bloku implementacji oryginalnej klasy. 44
Użycie rozszerzania klas do ukrywania prywatnych elementów klasy Pierwotny interfejs klasy jest używany do zdefiniowania zachowania i interakcji z klasą jako interfejs publiczny Rozszerzenie klasy dodaje do niej prywatne metody, do użycia wewnątrz jej implementacji. 45
Użycie rozszerzania klas do ukrywania prywatnych elementów klasy Pierwotny interfejs Rozszerzenie Redeklaracja zmiennych 46
Użycie rozszerzania klas do ukrywania prywatnych elementów klasy Kompilator wygeneruje metody Getter jako publiczną Setter jako prywatną, dostępną wewnątrz klasy. Prywatność zapewniana jest przez zadeklarowanie rozszerzenia klasy wewnątrz kodu źródłowego implementacji Klasy. 47
Bloki Element języka. Oznaczany znakiem karetki ^ 48
Bloki Można zadeklarować zmienną (podobnie jak wskaźnik do funkcji), która będzie skojarzona z blokiem. 49
Bloki Można wywołać wykonanie bloku. Można przekazać blok jako argument metody Są obiektami, więc można je wstawić na przykład do kolekcji 50
Bloki Mogą przyjmować argumenty i zwracać wartości 51
Bloki Można przechwycić wartości zmiennych widocznych w zakresie, w którym definiowany jest blok. 52
Bloki Blok przechwytuje wartości zmiennych Wartość oryginalnej zmiennej jest nietknięta Blok nie może zmienić wartości oryginalnej zmiennej Blok nie może zmienić wartości zmiennej przechwyconej (zadeklarowana jako const) 53
block Variables Modyfikator pozwalający na współdzielenie dostępu do zmiennej pomiędzy oryginalną metodą a blokiem 54
Blok jako argument metody Dobra praktyka jeden blok jako ostatni argument 55
Właściwość dla bloku 56
Zakończenie KONIEC 57