PROJEKT INŻYNIERSKI AKADEMIA GÓRNICZO-HUTNICZA IM. STANISŁAWA STASZICA W KRAKOWIE



Podobne dokumenty
Politechnika Poznańska, Instytut Informatyki, TWO/GE. Programowanie dla ios

Programowanie dla ios

Programowanie aplikacji na iphone. Wstęp do platformy ios. Łukasz Zieliński

Programowanie dla ios

Programowanie dla ios

Temat 3. Projektowanie interfejsu użytkonwnika Kalkulator pierwszy program dla IOS

Programowanie dla iphone projektowanie interfejsu użytkownika

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

OBC01/TOPMOB Projektowanie w języku Objective-C

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Dzięki szkoleniu. Dni: 3. Opis: Adresaci szkolenia

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Krótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

Temat 4. Storyboard i element interfejsu użytkownika Gra w kulki- część 1

Java jako język programowania

BUDOWA APLIKACJI NA PLATFORMĘ IPHONE/IPAD. dr inż. Marcin Tomana

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Dokument Detaliczny Projektu

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Plan. Wprowadzenie. Co to jest APEX? Wprowadzenie. Administracja obszarem roboczym

Android - wprowadzenie. Łukasz Przywarty

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Cechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;

Plan. Aplikacja. Architektura aplikacji. Architektura aplikacji Tworzenie aplikacji Application Builder podstawy

Tworzenie oprogramowania

Projektowanie, tworzenie aplikacji mobilnych na platformie Android

Zacznij Tu! Poznaj Microsoft Visual Basic. Michael Halvorson. Przekład: Joanna Zatorska

Czym są właściwości. Poprawne projektowanie klas

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

REFERAT PRACY DYPLOMOWEJ

Instalacja SQL Server Express. Logowanie na stronie Microsoftu

Wprowadzenie do Objective-C

Forum Client - Spring in Swing

Część I Rozpoczęcie pracy z usługami Reporting Services

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Konspekt pracy inżynierskiej

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

16) Wprowadzenie do raportowania Rave

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski

REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i realizacja serwisu ogłoszeń z inteligentną wyszukiwarką

JavaFX. Technologie Biznesu Elektronicznego. Wydział Informatyki i Zarządzania Politechnika Wrocławska

Podstawy technologii cyfrowej i komputerów

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Instrukcja obsługi. Karta video USB + program DVR-USB/8F. Dane techniczne oraz treść poniższej instrukcji mogą ulec zmianie bez uprzedzenia.

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie w języku Swift : Big Nerd Ranch guide / Matthew Mathias, John Gallagher. Gliwice, cop Spis treści

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia

Wykład Ćwiczenia Laboratorium Projekt Seminarium

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Tworzenie prezentacji w MS PowerPoint

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Tworzenie aplikacji Web Alicja Zwiewka. Page 1

Dokument Detaliczny Projektu

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wprowadzenie do biblioteki klas C++

Wykład 8: klasy cz. 4

COMARCH IT AKADEMIA. Programista VBA w Microsoft Excel (microbootcamp)

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

System zarządzający grami programistycznymi Meridius

Programowanie w języku Python. Grażyna Koba

1.Wstęp. 2.Generowanie systemu w EDK

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

SpriteKit. Biblioteka do tworzenia gier wbudowana w SDK. Wspiera grafikę 2D w oparciu o sprite y

To sposób w jaki użytkownik wchodzi w interakcje z systemem. Środowisko graficzne używa kombinacji graficznych elementów(przyciski, okna, menu) i

Języki i paradygmaty programowania - 1

Tworzenie natywnych aplikacji na urządzenia mobilne - PhoneGap Tomasz Margalski

<Nazwa firmy> <Nazwa projektu> Specyfikacja dodatkowa. Wersja <1.0>

Szczegółowy opis zamówienia:

Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu.

Mariusz Trzaska Modelowanie i implementacja systemów informatycznych

INŻYNIERIA OPROGRAMOWANIA

Programowanie Obiektowe GUI

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Opis szybkiego uruchomienia programu APBSoft

Wykład 3 Składnia języka C# (cz. 2)

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Analiza i projektowanie aplikacji Java

Programowanie obiektowe

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Architektura Systemu. Architektura systemu umożliwia kontrolowanie iteracyjnego i przyrostowego procesu tworzenia systemu.

tel. (+48 81) /22 fax (+48 81) Cel przedmiotu

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Międzyplatformowy interfejs systemu FOLANessus wykonany przy użyciu biblioteki Qt4

Transkrypt:

AKADEMIA GÓRNICZO-HUTNICZA IM. STANISŁAWA STASZICA W KRAKOWIE Wydział Inżynierii Metali i Informatyki Przemysłowej PROJEKT INŻYNIERSKI pt. Opracowanie aplikacji dla systemu Apple ios do obróbki zdjęć z użyciem frameworka Cocoa Touch oraz Quartz 2D Imię i nazwisko dyplomanta: Adrian Malina Kierunek studiów: Informatyka Stosowana Profil dyplomowania: Systemy Informatyki Przemysłowej Nr albumu: 210658 Opiekun: dr Magdalena Kopernik Podpis dyplomanta: Podpis opiekuna: Kraków 2012

Oświadczam, świadomy(- a) odpowiedzialności karnej za poświadczenie nieprawdy, że niniejszy projekt inżynierski wykonałem(- am) osobiście i że nie korzystałem(- am) ze źródeł innych niż wymienione w pracy. Kraków, dnia... Podpis dyplomanta... Strona 2

Spis treści: 0. Wstęp 4 Część I teoretyczna 1. System operacyjny Apple ios 6 1.1 Historia systemu ios 6 1.2 Architektura systemu ios 7 2. Środowisko Xcode 4 oraz język Objective-C 10 2.1 Środowisko programistyczne Xcode 10 2.2 Język Objective-C 13 2.2.1 Przekazywanie komunikatów 14 2.2.2 Interfejs i implementacja 14 2.2.3 Akcesory 15 2.2.4 Tworzenie obiektów 16 2.2.5 Zarządzanie pamięcią 16 2.3 Instruments 17 3. Cel projektu 19 Część II projekt aplikacji do obróbki grafiki 4. Frameworki użyte w projekcie 21 4.1 Cocoa Touch 21 4.2 Quartz 2D 24 4.3 Core Image 25 5. Opis aplikacji 26 5.1 Interfejs programu 26 5.2 Struktura programu 27 5.3 Okno pobierania zdjęcia z aparatu lub galerii 28 5.4 Dostępne filtry graficzne 30 6. Testowanie aplikacji i dyskusja wyników 32 7. Wnioski i podsumowanie 37 Spis ilustracji 38 Spis tabel 38 Bibliografia 39 Strona 3

0. Wstęp Rosnąca popularność urządzeń mobilnych przyczyniła się do powstania nowoczesnych systemów operacyjnych wyposażonych w zestaw zaawansowanych środowisk programistycznych i frameworków służących do zwiększania efektywności pracy programisty nad projektem zapewniając sprawdzoną i stabilną funkcjonalność. Pomimo wcześniejszego istnienia kilku rozbudowanych systemów operacyjnych przeznaczonych dla urządzeń mobilnych (takich jak BlackBerry OS, czy Windows Mobile) prawdziwy wzrost popularności tych urządzeń przyniósł Apple iphone zaprezentowany na konferencji Macworld w 2007 roku. Początkowo nie wyróżniał się on na tle konkurencji, wręcz był on funkcjonalnie zacofany w stosunku do istniejących produktów (włączając w to brak możliwości instalowania zewnętrznych aplikacji), jednak spójny wygląd, oraz wyjątkowo prosta obsługa przyczyniły się do ponad sześciu milionów aparatów pierwszej generacji. Udostępnienie SDK (ang. Software Development Kit) zintegrowanego z IDE XCode oraz wprowadzenie cyfrowego modelu dystrybucji oprogramowania App Store przyczyniło się do gwałtownego rozwoju rynku aplikacji mobilnych. Tylko w pierwszych stu dniach działania usługi App Store osiągnięto wynik 200 milionów pobrań aplikacji. Skuteczność tego modelu dystrybucji oprogramowania natychmiast zauważyła konkurencja otwierając Google Android Market, Nokia Ovi Store czy też BlackBerry App World, jednak to Apple wciąż pozostaje niekwestionowanych liderem jeśli chodzi o przychód ze sprzedaży. O potędze rynku aplikacji mobilnych może świadczyć fenomen gry Angry Birds pobranej ponad pół miliarda razy. Framework Cocoa Touch wraz ze zintegrowanym środowiskiem programistycznym XCode oraz język Objective-C stały się obok Android SDK najbardziej pożądanymi umiejętnościami na rynku programowania urządzeń mobilnych, spychając królującą dotychczas Javę ME. Przedstawiona praca opisuje realizację projektu aplikacji do obróbki graficznej z wykorzystaniem warstwy systemu graficznego Quartz realizującego obsługę grafiki dwuwymiarowej. Strona 4

Część I - Teoretyczna Strona 5

1. System Operacyjny Apple ios 1.1 Historia systemu ios System Apple ios wywodzi się bezpośrednio z systemu Apple Mac OS X [1], który przeznaczony jest na komputery typu Macintosh. Początkowo były one wyposażone w procesory IBM PowerPC typu RISC, jednak z powodu problemów z dostawami, oraz wysoką ceną zostały one wyposażone w procesory o architekturze Intel x86. Mac OS X był nowym systemem [2], odcinającym się od architektury Mac OS Classic. Wywodzi się on z projektu NeXT przeznaczonego dla stacji roboczych, który to był oparty o architekturę Mach oraz 4.4BSD (Rysunek 1.). Jako natywny język programowania użyto obiektowo zorientowanego Objective-C. NeXT BSD 4.4 Rhapsody (1997) MacOS X (1999) ios (2007) Rysunek 1. Schemat rozwoju systemu ios (opracowanie własne na podstawie Kernelthread [2]). W 1997 roku podupadająca firma Apple postanowiła ponownie zatrudnić Steve a Jobsa, który postanowił wykupić swoją firmę NeXT Inc., po czym rozpoczął rozwój systemu Rapsody mającego być kontynuacją systemu Mac OS Classic przeznaczonego dla komputerów Macintosh. Duży nacisk położono na możliwość uruchamiania oprogramowania z klasycznej wersji systemu, jednocześnie wdrażając całkiem inną, Uniksową architekturę. Stabilna wersja systemu MacOS X 10.0 została wydana w 2001 roku. Mobilny system Apple ios, który początkowo nie posiadał nazwy własnej w prostej linii wywodzi się z biurkowego MacOS X. Został wydany w 2007 roku wraz z premierą pierwszego iphone a. Pierwsze wydanie ios systemu było zamknięte na aplikacje zewnętrze i nie posiadało publicznego SDK, co było główną przyczyną krytyki iphone a. Zestaw aplikacji ograniczał Strona 6

się jedynie do obsługi wiadomości tekstowych, kalendarza, galerii zdjęć, aparatu, kalkulatora, giełdy, map, pogody, notatek, zegara, telefonu, maila, przeglądarki internetowej i obsługi muzyki. Wraz z drugim wydaniem w 2008 roku Apple upubliczniło App Store a wraz z nim zestaw narzędzi programistycznych. Cyfrowy model dystrybucji oprogramowania stał się zamknięty, gdyż App Store jest jedyną, zgodną z licencją możliwością zainstalowania zewnętrznych aplikacji, jednak wysokie wymagania stawiane programistom w procesie akceptacji aplikacji do wirtualnego sklepu ograniczają dostępność do wadliwego, bądź złośliwego oprogramowania. 1.2 Architektura systemu ios Architektura systemu ios i MacOS X w dużej mierze jest wspólna, jednak wydzielono z Cocoa API warstwę dla urządzeń mobilnych Cocoa Touch, oraz uproszczono inne składniki systemu, bądź się ich pozbyto (jak np. maszyny wirtualnej Javy). System ios udostępnia cztery warstwy abstrakcji frameworków(rysunek 2.) [3], do których może odwoływać się programista. Cocoa Touch Media Services Core Services Core OS Jądro Środowisko jądra MACH System plików Sieć BSD Obsługa I/O Sterowniki Rysunek 2. Schemat budowy systemu ios (opracowanie własne na podstawie Techtopia [3]). Każda wyższa warstwa zwiększa poziom abstrakcji rozwiązania dostarczając przy tym narzędzia przyczyniające się do zmniejszenia nakładu pracy programisty oraz zredukowania objętości kodu, co bezpośrednio przyczynia się do poprawy jakości wytwarzanego oprogramowania. Strona 7

Przykładowo warstwa Cocoa Touch dostarcza framework Adress Book UI (AdressUI.framework) zapewniający integrację z książką adresową systemu. Tę samą funkcję może realizować framework Address Book (AdressBook.framework) z warstwy Core Services. Jednak wysoce abstrakcyjna warstwa z Cocoa Touch dostarcza nam domyślnie cztery kontrolery wraz z gotowym interfejsem graficznym do ich obsługi, których wywołanie i obsługa ogranicza się do kilku linijek kodu. Framework niższej warstwy abstrakcji ogranicza się jedynie do bezpośrednich odwołań do bazy danych książki adresowej pozostawiając nam realizację reszty zadań samodzielnie (np. stworzenie GUI). Warstwa Cocoa Touch jest najwyższą warstwą abstrakcji dostępną w systemie ios. Jej głównymi zadaniami są: obsługa rysowania elementów graficznego interfejsu użytkownika, zarządzanie cyklem życia aplikacji i wielozadaniowością oraz przechwytywanie i rozpoznawanie gestów wielodotykowych. Poza tym pozwala na integrację aplikacji z Mapami Google, książką adresową, obsługę wiadomości tekstowych i e-maili, komunikację między wieloma urządzeniami, a także dostarcza możliwość włączenia do aplikacji reklam z platformy iad firmy Apple. Niższą warstwą jest warstwa multimedialna (ang. Media Services) zawierająca frameworki do renderowania grafiki i tekstu oraz obsługę audio. Do najważniejszych z nich można zaliczyć Core Animations, Core Audio, Core Text, OpenAL, OpenGL ES oraz (użyty w moim projekcie) Quartz 2D wraz z podlegającym mu frameworkiem Core Image, które dostarczają wydajne środowisko do renderowania grafiki 2D z użyciem GPU. Warstwa usług podstawowych (ang. Core Services) dostarcza najbardziej istotne usługi dla działania systemu, do których odwołują się warstwy wyższego poziomu. Kluczowymi frameworkami dostarczonymi przez Core Services są: Foundation Framework najważniejszy framework używany przy pracy z Objective- C. Jest zestawem klas mającym na celu przyśpieszenie pracy z językiem Objective-C. Klasy dostarczane przez niego rozpoczynają się od liter NS od nazwy systemu NextStep. Core Foundation Framework oparty o język C dostarcza podstawową funkcjonalność taką jak typy danych, kolekcje, praca ze Stringami, komunikację socketową i obsługę portów, wątki itp. Core Data Framework - zarządza modelem przechowywania danych. Zamiast pisać strukturę przechowywania danych ręcznie, modeluje się je z pomocą graficznych narzędzi Xcode. Przy wykonywaniu aplikacji wymodelowana struktura danych jest tworzona i zarządzana za pomocą tego frameworku. Dane są przechowywane przy Strona 8

pomocy bazy SQLite, a framework zapewnia sprawdzanie poprawności typów danych, sprawdzania spójności między relacjami, wsparcie dla grupowania, filtrowania i organizowania danych w pamięci. Core Location Framework zbiera informacje o położeniu za pomocą GPS, stacji bazowych GSM oraz sieci WiFi. Biblioteki SQLite dostarczają lekkie i wydajne środowisko SQL, którego obsługą zajmuje się Core Data Framework. Programista ios rzadko odwołuje się do warstwy Core Services bezpośrednio szukając rozwiązania prostszego, dostarczonego przez wyższe warstwy abstrakcji. Ostatnią warstwą jest warstwa bazowa systemu Core OS która odwołuje się bezpośrednio do sprzętu. Obsługuje urządzenia takie jak Akcelerometr, Bluetooth, a także zapewnia obsługę akcesoriów zewnętrznych wpinanych do urządzenia za pomocą 30- pinowego wejścia, bądź przez Bluetooth. Najważniejszą częścią tej warstwy jest System. System oparty jest o hybrydowe jądro Darwin (Tabela 1.) [4] przystosowane do pracy pod 32-bitową architekturą typu RISC ARM (ang. Advanced RISC Machine). Łączy ono mikrojądro Mach 3, oraz wiele elementów systemu 4.4BSD takich jak stos sieciowy, czy wirtualne systemy plików. Dzięki włączeniu krytycznych usług do jądra można zachować wysoką wydajność dla najważniejszych zadań (jak w jądrach monolitycznych). Natura mikrojądra natomiast zapewnia modułowość, bez potrzeby wkompilowania całej funkcjonalności do jądra opcjonalne moduły mogą działać w przestrzeni użytkownika. MACH BSD Mikrojądro Mach zarządza zasobami takimi jak użycie procesora, pamięci, planowanie wykonywania procesów oraz dostarcza infrastrukturę do komunikacji z innymi warstwami systemu operacyjnego. Warstwa BSD dostarcza obsługę systemów plików, sieci, systemu bezpieczeństwa UNIX, modelu procesów BSD (sygnały, ID procesów itp.), zgodność z API POSIX a oraz wątki POSIX owe pthreads. Tabela 1. Opis warstw jądra (opracowane na podstawie osxbook.com [4]) Poza UNIXowym hybrydowym jądrem warstwa System dostarcza zestaw narzędzi bazowych. Za pomocą biblioteki LibSystem (napisanej w języku C) mamy dostęp do obsługi wątków (POSIX), sieci (BSD), systemu plików, wejścia/wyjścia, usług DNS, informacji lokalizacyjnych, zarządzania pamięci czy też funkcji matematycznych. Strona 9

2. Środowisko Xcode 4 oraz język Objective-C W tym rozdziale zostały przedstawione dwa główne narzędzie do tworzenia aplikacji dla systemu ios środowisko programistyczne Xcode [5], wraz z jego narzędziami pomocniczymi, oraz język Objective-C przeznaczony do programowania w dedykowanym dla ios SDK. 2.1 Środowisko programistyczne Xcode Xcode [5] jest zintegrowanym środowiskiem programistycznym przeznaczonym do rozwoju oprogramowania na platformę MacOS X oraz ios. Poza edytorem kodu i kompilatorem zawiera narzędzia do debugowania, kontroli wersji, emulator urządzeń ios a, a także narzędzia do badania wydajności, diagnostyki połączeń sieciowych, Bluetooth, USB. Środowisko obsługuje wiele języków programowania w tym: C, C++, Objective-C, Java, Python, Ruby. Potrafi ono tworzyć pliki wykonywalne uruchamiające się jednocześnie na platformie PowerPC, a także Intel x86. W przypadku aplikacji na ios docelową architekturą jest ARM. Rysunek 3. Podstawowe narzędzia środowiska Xcode 4 (zrzut ekranu) Podstawowym zestawem aplikacji są: Xcode zintegrowane środowisko programistyczne. Instruments zestaw narzędzi debbugerskich. Dashcode narzędzie do tworzenia widgetów przystosowanych do systemowego Dashboarda (specjalnej przestrzeni, w której można je umieszczać), a także do tworzenia małych narzędzi dla przeglądarki Safari oraz Mobile Safari. Quartz Composer środowisko do programowania wizualnego. Efekty graficzne tworzy się składając z gotowych komponentów diagramy. Powstające kompozycje Strona 10

mogą być wyeksportowane do postaci wtyczki i użyte w zewnętrznych programach. Za pomocą akcji Automatora stworzony efekt może być zaaplikowany do dowolnego zdjęcia, filmu, czy też kontrolki w aplikacji. Niestety na chwilę obecną nie można ich użyć bezpośrednio przez SDK ios. W porównaniu do poprzednich wersji Xcode a wersja 4 została znacząco zmieniona [5]. Interfejs programu został zunifikowany. Wielookienkowy tryb pracy został sprowadzony do jednego okna roboczego. Projektant interfejsu aplikacji Interface Builder - został zintegrowany z głównym oknem aplikacji. Aby zaprogramować wybraną akcję (tzw. Outlet) wystarczy przeciągnąć kontrolkę do okna edytora klas. Moduł Assistant służący do modelowania baz danych pozwala na wizualne projektowanie struktury bazy. Co więcej każda zmiana w diagramie powoduje automatyczne generowanie kodu klas służących do obsługi danych. W gestii programisty pozostają jedynie ewentualne drobne poprawki. Okno programu Xcode 4 (Rysunek 4.) domyślnie składa się z kilku głównych paneli, choć jest w dużym stopniu konfigurowalne. Lewa strona górnego panelu służy do sterowania procesem wykonywania aplikacji można wybrać rodzaj kompilacji (Run, test, profile, analyse), zatrzymać aplikację, wybrać urządzenie docelowe (skonfigurowane urządzenie fizyczne, bądź też symulator), przeskakiwać między pułapkami. Prawa strona odpowiada za włączanie paneli środowiska. Nawigacja Edytor kodu Debuggowanie Biblioteki Inspektor Rysunek 4. Okno programu Xcode 4. Strona 11

Panel nawigacji (Rysunek 5.) [6] służy do przeglądania zasobów projektu. W zależności od wybranej ikony można nawigować w różny sposób: Rysunek 5. Panel nawigacji (ze strony ios Developer Library [6]). Project navigator pozwala na przeglądanie projektu wyświetlając jego zawartość jako pliki. Widok umożliwia tworzenie nowych plików, dołączanie frameworków do projektu, oraz przeglądanie plików wynikowych działania projektu. Symbol navigator dostarcza hierarchiczny schemat klas, metod, atrybutów i innych struktur związanych z paradygmatem programowania obiektowego. Pozwala na łatwą refaktoryzację oraz enkapsulację kodu. Search navigator wyszukiwarka fraz. Issue navigator pokazuje błędy i ostrzeżenia związane z kodem projektu a także proponuje rozwiązania problemów. Debug navigator zawiera podstawowe narzędzia debuggerskie. Breakpoints navigator pomaga w przeskakiwaniu między pułapkami podczas wykonywania programu. Log navigator dostarcza interfejs do przeglądania logów tworzonych podczas kompilacji oraz podczas czasu pracy aplikacji. Edytor kodu posiada wiele pomocniczych funkcjonalności przyspieszających pracę z kodem, takich jak automatyczne formatowanie kodu, generowanie wcięć, sugerowanie i poprawianie kodu oraz dostęp do dokumentacji online. Dzięki funkcji Assistant editor możemy podzielić okno edytora na dwie części i jednocześnie poruszać się po pliku nagłówkowym i implementacji w przypadku edycji klas. Uruchamiając plik widoku (.xib lub.nib) możemy w prosty sposób tworzyć akcje przeciągając jedynie wybraną kontrolkę (np. Button) do okna edycji klasy. Assistant uzupełni kod tworząc twz. outlet o wybranych parametrach. Co więcej Assistant editor pozwala na graficzne tworzenie modeli relacyjnych baz danych i ich późniejszy eksport w formie klas używających frameworka Core Data. Panel Inspektora wyświetla informacje o obecnie edytowanym pliku takie jak kodowanie, rodzaj znaków zakończenia linii czy też ścieżkę pliku. Strona 12

Panel Bibliotek (Rysunek 6.) [6] zawiera gotowe elementy, które można wykorzystać w tworzonym projekcie. Zakładka File Template zawiera gotowe schematy plików takich jak klasy, widoki, kontrolery. Code Snippets zawiera kawałki kodu, które można używać wielokrotnie, np. deklaracje struktur obiektowych (klasy, typy wyliczeniowe, unie, struktury), pętle, bloki wyjątków, bloki switch czy też alokowanie pamięci. Rysunek 6. Panel bibliotek (opracowanie własne na podstawie ios Developer Library [6]). Panel Objects jest zbiorem funkcji i kontrolek frameworka Cocoa Touch, które zostały opisane w Rozdziale 4.1. Panel Media dostarcza nam dostęp do zawartości multimedialnej projektu, takich jak pliki graficzne, audio i wideo. W nowym Xcode [7] wprowadzono także nowy kompilator Apple LLVM Compiler 2.0 dla języków C, Objective-C oraz C++, który jest znacznie szybszy od używanego wcześniej GCC. Podświetlanie składni oraz uzupełnianie kodu jest realizowane przez ten sam parser co podczas kompilacji, a nie przez wewnętrzny parser środowiska, dzięki czemu już podczas edycji kodu eliminujemy możliwe błędy kompilacji. 2.2 Język Objective-C Język Objective-C [8-10] powstał jako rozszerzenie obiektowe języka C za wzór przyjmując pierwszy w pełni język obiektowy Smalltalk. Aby odróżnić elementy obiektowe języka od klasycznej składni C użyto symboli nawiasów kwadratowych [] oraz symbolu @. Klasa składa się z dwóch plików pliku nagłówkowego.h (ang. header), oraz pliku.m (ang. implementation) zawierającego definicje metod. Do języka wprowadzono także własne typy na wzór typów z czystego C, z których najważniejszy jest id, będący referencją do obiektu. Dla programisty popularnych języków obiektowych jak Java, czy C++, których obiektowość jest oparta o język Simula składnia zaczerpnięta ze Smalltalka może wydawać się dziwna. Strona 13

2.2.1 Przekazywanie komunikatów W języku Objective-C nie wykonuje się operacji wywołując metody, a wysyła komunikaty. Aby wysłać komunikat method do obiektu object z argumentem argument należy użyć następującej składni: [obiect method:argument]; co odpowiada wywołaniu metody w C++: obiect -> method(argument); Możliwe jest także używanie komunikatów zagnieżdżonych (w przypadku więcej niż dwóch komunikatów przyjęto konwencję zapisywania ich w wielu linijkach): [obiect method:[obiect2 method2]]; Bardzo charakterystyczne jest przekazywanie komunikatów z wieloma parametrami. Wywołanie metody zdefiniowanej tak: -(int) zmienpolozeniex:(int)x Y:(int)y Z:(int)z; odbywa się następująco: [obiect zmienpolozeniex:5 Y:15 Z:25]; Takie przekazanie komunikatu nie ma swojego odpowiednika w języku C++ w wywoływaniu metody. 2.2.2 Interfejs i implementacja Pliki nagłówkowe i implementacja klasy przypomina tę znaną z języka C++. Obrazowy interfejs i implementację przedstawia Tabela 2. przyklad.h #ifndef przyklad h #define przyklad h C++ przyklad.cpp #include <iostream>; #include "przyklad.h"; class Przyklad { private: int zmienna; public: // metody statyczne static typ metodastatyczna(); // metody obiektu typ metoda(typ parametr, typ parametr2); }; typ Przyklad::metodaStatyczna(){ // ciało metody return zmienna; } typ Przyklad::metoda(typ parametr, typ parametr2){ // ciało metody return zmienna; } #endif Strona 14

przyklad.h #import <Foundation/Foundation.h> @interface Przyklad : NSObject{ //zmienne prywatne @private int zmienna; } // metody klasy +(typ)metodastatyczna; //metody obiektu -(typ)metoda:(typ)parametr kilkaparametrow:(typ)parametr2; @end Objective- C przyklad.m #import "Przyklad.h" @implementation Przyklad +(typ) metodastatyczna{ // ciało metody return zmienna; } -(typ)metoda:(typ)parametr kilkaparametrow:(typ)parametr2{ // ciało metody return zmienna; } @end Tabela 2. Porównanie schematycznego wyglądu klasy w językach C++ i Objective- C Słowo kluczowe @interface w języku Objective-C jest odpowiednikiem deklaracji w pliku nagłówkowym w języku C++ (nie należy go mylić ze słowem interface znanym z języków Java i C#, które deklarują abstrakcyjną reprezentację klasy w języku Objective-C odpowiedzialne są za to protokoły - @protocol). Podobnie jak w języku C++ zmienne i metody mają swój poziom widoczności (co określają słowa @public oraz @private). Odpowiednikiem słowa kluczowego static w Objective-C jest symbol +. Metodę opatrzoną tym symbolem nazywamy metodą klasową. 2.2.3 Akcesory Tradycyjny zapis gettera i settera wygląda następująco: [obiekt setzmienna: (void)zmienna]; // setter wyjscie = [obiekt zmienna]; // getter Przyjęło się, iż nie używa się prefiksu get. Od wprowadzenia Objective-C 2.0 istnieje możliwość używania notacji z kropką: obiekt.zmienna = (typ)zmienna2; // setter wyjscie = obiekt.zmienna; // getter Należy pamiętać, iż w jednym projekcie powinno się używać jednej konwencji odwoływania się do obiektu. W języku Objective-C zmienne obiektu są zmiennymi prywatnymi w związku z czym trzeba utworzyć odpowiedni akcesor: -(typ) metoda:(typ)zmienna { return [self innametoda: zmienna]; } Strona 15

co odpowiadało by w C++: typ metoda (typ)zmienna { return this -> innametoda(zmienna); } 2.2.4 Tworzenie obiektów Istnieją dwa główne sposoby tworzenia obiektów. Pierwszy z nich jest bardziej automatyczny i tworzy obiekty samozwalniające (ang. autorelease) się: typ* nowyobiekt = [typ zmienna]; Drugi zagnieżdżony sposób jest sposobem niskopoziomowym: typ* nowyobiekt = [[typ alloc] init]; Metoda alloc rezerwuje pamięć i instancję obiektu określonego typu, a metoda init dokonuje wstępnej konfiguracji obiektu, jak ustawianie zmiennych instancji. Używając typów wbudowanych Objective-C przeważnie nie znamy szczegółów tego procesu. Jednak wiele klas posiada wiele wersji metody init, np. klasa NSNumber: NSNumber* nowyobiekt = [[NSNumber alloc] initwithfloat:5.2]; 2.2.5 Zarządzanie pamięcią W porównaniu do takich języków jak Java, czy C# Objective-C nie oferuje Garbage Collectora do 5-tej wersji ios SDK. Jeżeli alokujemy pamięć dla obiektu musimy pamiętać o zwalnianiu pamięci po zakończeniu pracy z obiektem. Do śledzenia alokacji i ewentualnych wycieków pamięci można użyć narzędzi Instruments opisanych w Rozdziale 2.3. Najprostsze operacje zarządzania pamięcią to alokowanie i zwalnianie pamięci (Rysunek 7. (a)). Do tego służą metody alloc oraz release: typ *nowyobiekt = [[typ alloc] init ]; // alokujemy pamięć [argument release]; // zwalniamy pamięć (a) (b) (1) (0) [obj alloc] [obj release] (1) (0) (0) [obj alloc] [obj autorelease] [obj release] (c) (1) (0) (1) (0) [obj alloc] [obj autorelease] [obj retain] [obj release] Rysunek 7. Sposoby zarządzania pamięcią (opracowanie własne). Strona 16

Aby zwolnić pamięć można oprócz release użyć metody autorelease, która zwalnia obiekt, ale nie robi tego natychmiastowo (Rysunek 7. (b)). Szary kwadrat oznacza, iż obiekt istnieje w pamięci, natomiast (1) oraz (0) określa czy istnieje dostęp do obiektu. Trzecia metoda (Rysunek 7. (c)). umożliwia alokację obiektu, skonfigurowanie go i automatyczne zwolnienie z pamięci, jednak dostęp do obiektu jest zachowywany przez metodę retain. Jest to przydatne w momencie kiedy chcemy uzyskać dostęp do obiektu ostatni raz. Po wywołaniu metody retain obiekt zostanie usunięty z pamięci. W Objective-C 2.0 został wprowadzony mechanizm odśmiecający pamięć nazywany Automatic Reference Counting. 2.3 Instruments Narzędzie Instruments składa się z wielu modułów(rysunek 8.) służących do badania jakości wytwarzanego oprogramowania, które przedstawia w formie wykresów, ale także umożliwia dostęp do dokładnych danych w formie logów tekstowych. Rysunek 8. Narzędzie Instruments dostępne moduły (zrzut ekranu). Moduły odpowiedzialne są za: Allocations śledzi alokowanie pamięci przez konkretne obiekty Strona 17

Leaks - poszukuje wycieków pamięci i prowadzi statystyki alokacji pamięci przez obiekty Activity Monitor monitor aktywności prowadzi statystyki dotyczące użycia procesora, pamięci, dysku czy sieci. Automation pozwala na tworzenie skryptów, które symulują interakcje z interfejsem użytkownika aplikacji Energy Diagnostics zbiera informacje na temat zużycia energii przez procesor, wyświetlacz, moduły Bluetooth, WiFi i GSM. Network Connections analizuje ruch sieciowy Core Animations bada wydajność renderowania animacji przy pomocy frameworka Core Animations OpenGL ES Analysis wyszukuje i analizuje problemy z wydajnością renderowania grafiki z użyciem OpenGL ES Instruments umożliwia śledzenie wykonywania programów dla urządzeń fizycznych z systemem ios oraz MacOS X, a także pozwala na pracę z symulatorem systemu ios. Strona 18

3. Cel projektu Celem niniejszego projektu jest stworzenie aplikacji do podstawowej obróbki zdjęć dla systemu ios z możliwością pobierania zdjęć z wbudowanej kamery bądź też z galerii zdjęć. W celu zrealizowania projektu posłużono się środowiskiem programistycznym Xcode 4 wraz z zainstalowanym ios SDK 5. Założono, iż interakcja między użytkownikiem a urządzeniem mobilnym ma być zrealizowana za pomocą frameworka Cocoa Touch, a stworzona aplikacja powinna być oparta o wzorzec projektowy Model-Widok-Kontroler. Renderowanie grafiki ma być zaimplementowane poprzez graficzne frameworki Quartz 2D oraz Cocoa Touch, a sama aplikacja ma umożliwiać pobieranie zdjęć bezpośrednio za pomocą aparatu wbudowanego w urządzenie. Strona 19

Część II - Projekt aplikacji do obróbki zdjęć Strona 20

4. Frameworki użyte w projekcie Założeniem przy projektowaniu aplikacji mobilnej na system ios było maksymalne wykorzystanie możliwości dostarczanych wraz z SDK firmy Apple a co za tym idzie zminimalizowanie implementacji własnych funkcji do niezbędnego minimum. Użyte SDK [3] w wersji 5-tej dostarcza ważną nowość przy projektowaniu aplikacji mianowicie framework Core Images, który wcześniej był dostępny jedynie dla biurkowej linii systemów Apple Mac OS X. 4.1 Cocoa Touch Framework Cocoa Touch jest obiektowym frameworkiem napisanym głównie w języku Objective-C służącym przede wszystkim do implementacji interakcji pomiędzy użytkownikiem a urządzeniem. Cocoa Touch implementuje wzorzec projektowy Model-Widok-Kontroler (Rysunek 8.) [12]. Model jest zestawem klas odpowiadających za reprezentację danych. Wszystkie funkcje operujące na zbiorach danych powinny być zawarte w nim. Model nie odpowiada za graficzną reprezentację danych, nie musi nawet wiedzieć, że takowa istnieje. Całość danych zawartych w modelu powinna być zhermetyzowana. Kontroler Model Widok Rysunek 9. Wzorzec projektowy Model- Widok- Kontroler [12]. Widok odpowiada za graficzną reprezentację programu w środowisku Xcode widok tworzy się za pomocą projektanta interfejsu Interface Buildera. Do stworzenia podstawowego interfejsu wystarczą proste operacje typu przeciągnij i upuść w tej pracy jedynie kilka widoków zostało wzbogaconych o własny kod. Większość interakcji realizuje wprowadzony przez SDK 5 Storyboard [13] narzędzie służące do tworzenia i dodawania interakcji za pomocą graficznego edytora. Storyboard (Rysunek 10.) rozwiązuje znaczną część problemów z nawigacją między widokami w projekcie występującymi w poprzednich wersjach SDK. Strona 21

Rysunek 10. Schemat widoków utworzonych za pomocą Storyboard (zrzut ekranu). Strona 22

Kontroler jest łącznikiem pomiędzy widokiem a reprezentacją danych. Odpowiedzialny jest za logikę aplikacji oraz za komunikację pomiędzy modelem a widokiem. Najważniejszą klasą w aplikacji jest klasa AppDelegate. Zawiera ona okno główne oraz domyślne metody mówiące o cyklu życia aplikacji. #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end Klasa ta domyślnie tworzy nową instancję okna, która automatycznie poszukuje głównego kontrolera widoków klasy RootViewController. Klasa ta nie jest niczym innym jak kontrolerem widoku utworzonego przez Storyboarda, który znajduje się w pliku MainStoryboard.storyboard, będącego plikiem XML. W przypadku tej aplikacji realizowany jest widok stron z klasy UIPageViewController. #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UIPageViewControllerDelegate> @property (strong, nonatomic) UIPageViewController *pageviewcontroller; @end Framework Cocoa Touch dostarcza pokaźny zestaw domyślnych obiektów. Zawarte są w nim między innymi: Kontrolki: o Label etykieta tekstowa, o Button przycisk dotykowy, o Text Field pole tekstowe o Slider suwak, o Switch przełącznik stanu, Widoki: o Table View widok tabeli (wiersze), o Image View widok obrazka, o Text View widok tekstu, o Web View zagnieżdżony widok strony internetowej, o Map View widok mapy, Rozpoznawanie gestów: o Tap Guesture gest pukania, o Pinch Guesture - gest szczypania, Strona 23

o Rotation Guesture gest obracania, o Swipe Guesture gest przesuwania, o Pan Guesture gest rozsuwania palców, o Long Press Guesture gest długiego przytrzymania palców, Obiekty i kontrolery o View Controller kontroler widoku, o Table View Controller kontroler widoku tabeli, o Navigation Controller kontroler widoku nawigacji, o Tab Bar Controller kontroler widoku kart, o Page View Controller kontroler widoku stron, Aby móc określić interakcje między obiektem a jego graficzną formą należy nadać obiektowi ujście (ang. outlet) bądź akcję. Ujście pozwala na odwołanie się do obiektu w celu, np. zmiany jego właściwości (np. zmiana etykiety tekstowej), natomiast akcja pozwala na określenie, która metoda klasy może być wywoływana bezpośrednio z widoku. #import <UIKit/UIKit.h> @interface Filters : UIView { UISlider *rotate; // definicja obiektu } @property (nonatomic, retain) IBOutlet UISlider *rotate; // ustawiamy outlet -(IBAction)doRotate:(id)sender; // definicja metody do której można przypisać akcję Po poprawnym ustaleniu w kodzie outletów oraz akcji możliwe będzie za pomocą projektanta interfejsów ustalenie interakcji (przez przeciągnięcie ikony plusa do odpowiedniej kontrolki w widoku). 4.2 Quartz 2D Framework Quartz 2D [14] jest dwuwymiarowym silnikiem renderującym dla systemów MacOS X dostarczającym podstawowych funkcji graficznych takich jak rysowanie prymitywów, przezroczystość, cienie, zarządzanie kolorami czy anty-aliasing. Pomimo, iż w projekcie nie został on bezpośrednio użyty to jest on podstawą dla innych frameworków systemu ios, takich jak Core Animation, Core Video, OpenGL ES oraz użyty w moim projekcie Core Images. Strona 24