Temat 2. Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C Wymagana wiedza wstępna: 1) Student musi 1) Umieć stworzyć projekt aplikacji konsolowej w XCode z wykorzystaniem Objective-C 2) Umieć skompilować i uruchomić program w XCode 3) Skorzystać z podstawowych klas i funkcji Objective-C 4) Nauczyć się zasad wywoływania metod w Objective-C 5) Znać język C 6) Znać zasady zarządzania pamięcią w komputerze 7) Znać pojecie wskaźnika 8) Znać podstawowe narzędzia tworzenia aplikacji konsolowych w C 2) Student powinien 1) Znać jezyk Java lub C# lub C++ Cel dydaktyczny 1) Student musi 1) Umieć tworzyć klasy Objective-C 2) Umieć tworzyć hierarchę klas w Objective-C 3) Umieć wykorzystywać późne wywołanie metod w Objective-C 4) Umieć korzystać z kolekcji 5) Umieć tworzyć własne inicjalizatory 6) Znać typ id 2) Student powinien 1) Umieć korzytstać z kategorii klas 2) Umieć definiować kategorie klas 7) Umieć używać wbudowanych struktur danych Objective-C 3) Student może 3) Umieć definiować protokoły 4) Umieć definiować bloki kodu Zakres tematyczny wykładu i laboratorium Niniejsze zajęcia wprowadzają szereg zaawansowanych zagadnień związanych z programowaniem w czystym Objective-C, naświetlając możliwości tego języka pod kontem różnic do innych znanych języków programowania obiektowego. Zostaną przedstawione zaawansowane metody deklaracji klas oraz rozszerzania klas istniejących. Konwencje nazewnictwa klas, obiektów, zmiennych i metod Składowe publiczne, prywatne i chronione alloc + init Właściwości zadeklarowane Zachowanie właściwości (readonly, readwrite, atomic, nonatomic, strong, retain) Praca z własną instancją zmiennej Przechowywanie obiektów w pamięci Silne referencje i słabe referencje NSCopying i (copy) Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 1/5 Protokoły i ich deklaracja i implementacja klas z nimi zgodnych Dziedziczenie protokołów Definicja i użycie kategorii - rozszerzanie własności klas Implementacja kategorii w plikach zewnętrznych Kategorie a nazewnictwo metod Kategorie anonimowe Użycie rozszerzania klas do ukrywania prywatnych elementów klasy. Bloki kodu Bloki kodu i dostęp do zmiennych Załączniki 1. Prezentacja_2.pdf - slajdy prezentacji wykładu Zadania na laboratorium Zadanie 1 Rozszerz klasę MaszynaLotto z poprzednich ćwiczeń, dodając do niej kategorię, pozwalającą na wylosowanie dodatkowo jeszcze jednej liczby z zakresu liczb (jak w grze Lotto z plusem). Użyj do tego kategorii ObjectiveC 1) Kategorię możesz zaimplementować wewnątrz istniejącego pliku lub stworzyć nową parę plików (MaszynaLotto+Plus.h i MaszynaLotto+Plus.m) 2) Wewnątrz nowopowstałych klas zdefiniuj metodę (NSNumber*)plus; #import "MaszynaLosujaca+Plus.h" @implementation MaszynaLotto (Plus) -(NSNumber *)plus{ int n = arc4random()%self.numery.count; return [self.numery objectAtIndex:n]; } @end Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 2/5 3) Zaimportuj do pliku main.m plik nagłówkowy kategorii. Teraz możesz korzystać z klasy MaszynaLotto i wywoływać na niej metodę plus #import <Foundation/Foundation.h> #import "MaszynaLosujaca.h" #import "MaszynaLosujaca+Plus.h" int main(int argc, const char * argv[]) { @autoreleasepool { MaszynaLosujaca * m = [[MaszynaLosujaca alloc]init]; NSNumber * plus = [m losuj]; printf("PLUS: %d\n",(int)plus.integerValue); for(int i =0;i<6;i++){ NSNumber * l = [m losuj]; printf("%d\n",(int)l.integerValue); } } return 0; } Zadanie 2 Stwórz nową klasę MaszynaMulti, która będzie rozszerzała klasę MaszynaLotto z poprzednich ćwiczeń. MaszynaMulti ma mieć możliwość losowania z 80 liczb. Podpowiedzi 1) W inicjalizatorze klasy MaszynaMulti uzupełnij brakujące liczby #import "MaszynaMulti.h" @implementation MaszynaMulti -(id)init{ self= [super init]; if(self){ for(int i = 50;i<=80;i++){ [self.numery addObject:[NSNumber numberWithInt:i]]; } } return self; } @end 2) W pliku nagłowkowym pamiętaj o zaimportowaniu pliku MaszynaLosująca.h Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 3/5 #import "MaszynaLosujaca.h" @interface MaszynaMulti : MaszynaLosujaca 3) Skorzystaj z tej klasy tak jak w poprzednich przypadkach MaszynaMulti * m = [[MaszynaMulti alloc]init]; for(int i =0;i<20;i++){ NSNumber * l = [m losuj]; printf("%d\n",(int)l.integerValue); } Zadanie 3 (samodzielne) W podobny sposób skonstruuj klasę MaszynaMiniLotto. Zadanie 4 Zadeklaruj tablicę, i umieść w niej obiekty MaszynaLotto, MaszynaMulti i MaszynaMiniLotto. Wylosuj jedną z nich i sprawdź, którą. Na tej podstawie ustal jaką ilość liczb wylosować. Podpowiedzi 1) Sprawdzenie jakiej klasy jest obiekt może być dokonane za pomocą metody isKindOfClass if ([maszyna isKindOfClass:[MaszynaMulti class]]){ n=20; } Zadanie 5 Dodaj do klasy MaszynaLotto metodę -(void)LosujWszystkie; W metodzie tej wylosuj i wypisz n liczb. n ma być określone jako właściwość klasy (ustawiana w inicjalizatorze). W metodzie main z zadania 4 rzutuj wszystkie obiekty na typ MaszynaLotto* i spróbuj na takim obiekcie uruchomić tę metodę. Do poszczególnych klas dodaj nowe implementacje metody losujWszystkie, tak aby wypisywały informację o typie losowania a następnie wywoływały przeładowaną metodę. Podpowiedzi 1) Modyfikacja meody main powinna wyglądać tak MaszynaLosujaca * maszyna = (MaszynaLosujaca*)[maszyny objectAtIndex:(arc4random()%maszyny.count)]; [maszyna losujWszystkie]; 2) metoda losujWszystkie ma korzystać w właściwości ilosc @property(atomic) int ilosc; 3) Przeładowanie metody losujWszystkie w klasie MaszynaMultiMulti -(void)losujWszystkie{ printf("%s\n","MultiMulti"); [super losujWszystkie]; } Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 4/5 Zadania samodzielne Zadanie 6 Utworzyć klasę ONP obliczającą wartość wyrażenia podanego w odwrotnej notacji polskiej. W tym celu należy wykorzystać strukturę stosu. W metodzie main() pobierz ze standardowego wejścia ciąg znaków. Następnie zainicjuj instancję klasy ONP z wykorzystaniem jedynego konstruktora przyjmującego jako parametr obiekt NSString* zawierający wyrażenie. Ponadto klasa powinna posiadać metodę wyznaczWartosc, która zwróci wartość wyrażenia. Należy założyć, że w wyrażeniu będą tylko liczby całkowite, jeden operator jednoargumentowy - zmieniający znak liczby oraz dwa operatory dwuargumentowe + i * reprezentujące dodawanie i mnożenie. Programowanie Urządzeń Mobilnych Apple - materiały do laboratorium - 5/5