Objective-C. Ryhmä 35: Ilpo Kärki Aleksi Pälä



Samankaltaiset tiedostot
TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

Groovy. Niko Jäntti Jesper Haapalinna Group 31

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

TIE Ohjelmistojen suunnittelu. Luento 8..9: moniperintä

812341A Olio-ohjelmointi, I Johdanto

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

Osoitin ja viittaus C++:ssa

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

1. Olio-ohjelmointi 1.1

11/20: Konepelti auki

Rajapinnat ja olioiden välittäminen

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Automaattinen muistinhallinta

815338A Ohjelmointikielten periaatteet

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Olio-ohjelmointi Johdanto olio-ohjelmointiin

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

P e d a c o d e ohjelmointikoulutus verkossa

Rajapinta (interface)

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Hakemistojen sisällöt säilötään linkitetyille listalle.

7. Oliot ja viitteet 7.1

Olio-ohjelmointi Javalla

815338A Ohjelmointikielten periaatteet

Graafisen käyttöliittymän ohjelmointi Syksy 2013

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

15. Ohjelmoinnin tekniikkaa 15.1

UML -mallinnus TILAKAAVIO

.NET ajoympäristö. Juha Järvensivu 2007

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

samalla seuraavaan puoliavaruuteen (sukupolveen), jota siivotaan harvemmin.

8. Näppäimistöltä lukeminen 8.1

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

9. Periytyminen Javassa 9.1

Ohjelmistojen mallintaminen Luokkakaaviot Harri Laine 1

2. Olio-ohjelmoinista lyhyesti 2.1

Test-Driven Development

Android ohjelmointi. Mobiiliohjelmointi 2-3T5245

SEMINAARI ESSEE: DYLAN. TIE Principles of Programming Languages

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

19/20: Ikkuna olio-ohjelmoinnin maailmaan

C++11 lambdat: [](){} Matti Rintala

1 Tavoitteet. 2 Periaatteet ja ominaisuudet. 2.1 Tyyppipäättely

15. Ohjelmoinnin tekniikkaa 15.1

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Erlang. Miika Heinonen ja Lassi Uosukainen (Group 92) TIE Principles of Programming Languages Seminaariessee. Yleistä

TIE Principles of Programming Languages CEYLON

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

12. Monimuotoisuus 12.1

Ohjelmoinnin perusteet Y Python

Abstraktit tietotyypit ja olio-ohjelmointi

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Ohjelmoinnin peruskurssien laaja oppimäärä

12. Monimuotoisuus 12.1

Ohjelmointi 1. Kumppanit

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Integrointi. Ohjelmistotekniikka kevät 2003

Test-Driven Development

Luokat. Luokat ja olio-ohjelmointi

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Common Lisp Object System

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Virtuaalifunktiot ja polymorfismi

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

Taulukot. Jukka Harju, Jukka Juslin

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

17/20: Keittokirja IV

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

M. Merikanto 2012 XML. Merkkauskieli, osa 2

4. Lausekielinen ohjelmointi 4.1

5. HelloWorld-ohjelma 5.1

Luokkakaavion laatiminen

Ohjelmoinnin perusteet Y Python

Harjoitustyö: virtuaalikone

Javan perusteita. Janne Käki

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmoinnin peruskurssien laaja oppimäärä

Järjestelmäarkkitehtuuri (TK081702)

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Transkriptio:

Objective-C Ryhmä 35: Ilpo Kärki Aleksi Pälä

Sisällysluettelo 1 Yleistä...3 1.1 Lyhyesti...3 1.2 Historiaa...3 1.3 Hybridikieli...3 2 Muistinhallinta...5 2.1 Manual Retain Release (MRR)...5 2.2 Automatic Reference Counting (ARC)...5 3 Ominaisuudet...7 3.1 Luokat...7 3.2 Viestinvälitys...7 3.3 Kategoriat...7 3.4 Protokollat...7 4 Objective-C vs. C++...8 Lähteet...9 2

1 Yleistä 1.1 Lyhyesti Objective-C on yleiskäyttöinen, olio-ohjelmointiin perustuva ohjelmointikieli. Se on Applen Mac OS X ja ios laitteiden pääohjelmointikieli. C++:n tavoin sen tarkoituksena oli tuoda olio-ohjelmoinnin periaatteita C-kieleen, kuitenkin käyttäen huomattavasti erilaista lähestymistapaa[1]. Objective-C rakentuu C:n päälle ja kaikki C-kielen ohjelmat voidaankin kääntää Objective-C kääntäjällä[2]. Näin Objective-C:n luokkiin voidaan helposti lisätä C-kielen koodia. Kieli noudattaa C:n syntaksia kaikilta niiltä osin, jotka eivät liity olio-ohjelmointiin. Olio-ohjelmointiin liittyvät osat puolestaan muistuttavat Smalltalk-ohjelmointikielen viestinvälitystä, jossa olioiden metodeja ei kutsuta, vaan niille lähetetään viestejä. Objective-C:n tiedostopäätteenä toimii otsikkotiedostoissa.h ja toteutustiedostoissa.m. 1.2 Historiaa Objective-C:n synty juontaa juurensa 1980-luvulle. Ohjelmoijat Brad Cox ja Tom Love halusivat tehdä koodin uudelleenkäytettävyydestä osan ohjelmistokehitystä. Tähän tavoitteeseen päästäkseen he päättivät käyttää oman kielensä pohjana Smalltalk-ohjelmointikieltä, joka on yksi ensimmäisistä olio-ohjelmointiin perustuvista kielistä[3]. Yhteensopivuutta C-kielen kanssa pidettiin äärimmäisen tärkeänä, joten he alkoivat myös työstää esikääntäjää, jonka toisi Smalltalkin oliopiirteitä C-ohjelmointiin. 1988 Steve Jobsin johtama NeXT lisensoi Objective-C:n omaan käyttöönsä ja lisäsi GCCkääntäjään mahdollisuuden kääntää myös Objective-C:llä kirjoitettua koodia. NeXT käytti Objective-C:tä rakentaakseen oman NeXTSTEP-käyttöjärjestelmänsä. Vuonna 1996 Apple osti NeXTin ja päätti käyttää sen luoman NeXTSTEPin koodipohjaa luomaan oman uuden käyttöjärjestelmänsä[4]. Näin Objective-C:stä tuli keskeinen osa Applen Mac OS X- käyttöjärjestelmää. Samaa koodipohjaa käytettiin myös luomaan käyttöjärjestelmät Applen ios mobiililaitteille. 1.3 Hybridikieli Objective-C on hybridi kahden kielen välillä, joista molemmat kuuluvat erilaisiin paradigmoihin. Tämä hankaloittaa sen kategorisointia. C lähtöisyyden perusteella Objective-C:n voidaan katsoa kuuluvan imperatiivisen ohjelmoinnin -paradigmaan tai strukturoidun ohjelmoinnin paradigmaan. 3

Objective-C:n olio-ohjelmointiin liittyvät ominaisuudet luotiin Smalltalkin pohjalta, joten se on myös osa olio-ohjelmoinnin paradigmaa. Nämä paradigmat näkyvät selkeästi Objective-C ohjelmien rakenteessa ja toteutuksessa. Ohjelmien varsinainen rakenne ja kulku on toteutettu käyttäen C- kielen ominaisuuksia. Smalltalkilta perittyjä olio-ohjelmoinnin ominaisuuksia käytetään puolestaan kun määritellään ja käytetään abstrakteja, oliopohjaisia, rakenteita. Objective-C käyttää muiden C-sukuisten kielten tapaan staattista tyypitystä muuttujien tyypitykseen. Muuttujat täytyy siis esitellä, niille tulee antaa tyyppi eikä niiden tyyppi voi ajon aikana muuttua. Olioiden kanssa toimimiseen Objective-C tarjoaa kuitenkin mahdollisuuden käyttää dynaamista tyypitystä. Tämä toteutetaan tyypin id avulla. Id on osoitin, joka voi osoittaa mihin tahansa olioon, tyypistä huolimatta[5][6]. Id tyypin avulla mahdollistetaan myös dynaaminen sidonta. Voimme siis luoda funktion, joka ottaa parametrikseen objektin, ja joka kutsuu tuon objektin jäsenfunktiota. Käyttämällä parametrin tyyppinä id:tä voimme olla varmoja, että funktio kutsuu oikean olion jäsenfunktiota. Tästä voi kuitenkin aiheutua ongelmia, koska tyyppitarkastelut tehdään ajon aikana. Näin ollen, jos parametrina annettu olio ei sisälläkään kutsuttua funktiota, tapahtuu ajonaikainen virhe ja ohjelma mahdollisesti kaatuu. Tämä voidaan estää käyttämällä Objective-C:n tukemaa viestien eteenpäin lähetystä, jonka avulla voidaan määrittää olion käyttäytyminen, jos se saa viestin jota se ei osaa käsitellä. 4

2 Muistinhallinta Objective-C sallii kahden erilaisen muistinhallintamenetelmän käyttämisen. Manual Retain Release-menetelmässä ohjelmoija itse huolehtii olioiden omistussuhteiden hallinnasta erilaisten funktioiden avulla. Xcode kehitysympäristön versiosta 4.2 eteenpäin ohjelmoijille on tarjottu mahdollisuus käyttää Automatic Reference Counting-menetelmää, jossa ohjelmoijan ei tarvitse huolehtia olioiden omistussuhteista itse, vaan se hoituu automaattisesti. ARC-menetelmän käyttöä suositellaan[7]. Molemmat menetelmät on esitelty omissa kappaleissaan. 2.1 Manual Retain Release (MRR) Käytettäessä Manual Retain Release (manuaalinen omistus ja vapautus, tästä eteenpäin MMR) ympäristöä ohjelmoijan täytyy itse huolehtia olioiden omistussuhteiden hallinnasta. Tämä onnistuu alla kuvatuilla muistinhallintaan tarkoitetuilla metodeilla[8]. Metodi Toiminta alloc Luo olion ja asettaa sille omistussuhteen retain Asettaa omistussuhteen olemassa olevalle oliolle copy Kopioi olion ja asettaa sille omistussuhteen release Vapauttaa olion omistussuhteesta ja tuhoaa sen välittömästi autorelease Vapauttaa olion omistussuhteesta, mutta ei tuhoa sitä Taulukko 1: Taulukko 1. Objective-C:n muistinhallintaan tarkoitetut metodit. Objective-C:n muistinhallinta perustuu viitteiden laskemiseen. Kun oliolle asetetaan omistussuhde (alloc, retain, copy) kasvaa viitteiden määrä yhdellä. Kun omistussuhde poistetaan (release, autorelease), laskee viitteiden määrä yhdellä. Olioon osoittavien viitteiden määrän laskiessa nollaan, ei yksikään toinen olio sano enää omistavansa olioa ja sen käyttämä muisti voidaan vapauttaa. Tämän menetelmän käyttämisestä aiheutuu se, että jokaista olioon kohdistettua alloc, retain tai copy kutsua kohden täytyy muistaa kutsua yhtä monta release tai autorelease kutsua. Jos viitteiden määrää ei pienennetä tarpeeksi, jää ohjelmaan ylimääräistä käyttämätöntä muistia, eli aiheutuu muistivuotoja. Jos taas olioita vapautetaan liian aikaisin, saatetaan suorittaa haku jo vapautettuun ja virheelliseen muistipaikkaan. 2.2 Automatic Reference Counting (ARC) Automatic Reference Countin (automaattinen viitteiden laskeminen, tästä eteenpäin ARC) toimii täysin kuten MMR, mutta sitä käytettäessä ohjelmoijan ei itse tarvitse huolehtia muistinhallintaan liittyvien metodien kutsumisesta. ARC analysoi kirjoitetun koodin ja selvittää olioiden elinajan. Tekemänsä analyysin perusteella se 5

asettaa koodiin tarvittavat retain, release ja autorelease kutsut. ARC:tä käytettäessä koodiin ei itse voi laittaa kyseisiä kutsuja. Sen sijaan alloc ja copy kutsuja voidaan käyttää. 6

3 Ominaisuudet 3.1 Luokat Luokat Objective-C:eessä toimivat kuten monissa muissakin kielissä, niillä on metodeja ja muuttujia. Luokkien rajapinta esitellään otsikkotiedostossa ja toteutus toteutustiedostossa. Kaikki luokat on periytetty muista luokista tai suoraan juuriluokasta(nsobject). Objective-C luokan kaikki metodit ovat julkisia, eikä yksityisiä metodeja pysty luomaan. Metodeja on kuitenkin mahdollista piilottaa erilaisilla tavoilla, mutta metodi ei ole kuitenkaan koskaan täysin saavuttamattomissa luokan ulkopuolelta. Muuttujat voivat olla julkisia, suojeltuja tai yksityisiä. 3.2 Viestinvälitys Objective-C:eessä ei kutsuta luokan metodeja kuten C++:ssa. Objective-C:essa sen sijaan lähetetään viestejä objekteille mikä toimii osittain metodikutsujen tapaan, mutta dynaamisesti. Kääntäjä luo käännösaikasesti luokalle taulukon sen sisältämistä metodeista ja tiedon sen kantaluokasta. Kun objekti vastaanottaa viestin se vertaa sitä sen metodi taulukkoon, jos metodi löytyy niin se suoritetaan, jos metodia ei kuitenkaan löydy välitetään viesti kantaluokalle, tätä jatketaan kunnes löydetään metodi tai päästään juuriluokkaan(nsobject), joka luo poikkeuksen[9]. Luokalle on myös mahdollista toteuttaa käsittelijä tunnistattomille viesteille ylikirjoittamalla muutama juuriluokan metodi jotka normaalisti loisivat poikkeuksen, näin on mahdollista estää poikkeuksien synty[10]. 3.3 Kategoriat Yksi tärkeimpiä mietinnän kohteita Objective-C:n suunnittelussa oli miten koodista saataisiin mahdollisimman helposti ylläpidettävää. Tähän ratkaisuna nähtiin sekä koodin uudelleen käytettävyys, että koodin jakaminen mahdollisimman pieniin palasiin. Kategorioiden avulla Objective-C:hen tuotiin mahdollisuus laajentaa jo olemassa olevia luokkia. Kategorioiden tuomat laajennukset lisätään luokkiin ajon aikana, joten vanhoja luokkia ei tarvitse edes kääntää uudelleen. Jos kategorian sisällä määritellään samanniminen metodi kuin minkä luokka itsessään jo sisältää, ei ole määritelty kumman toteutusta käytetään[11]. 3.4 Protokollat Protokollien avulla Objective-C:ssä on mahdollista toteuttaa eräänlaista moniperintää. Protokolla luodaan samaan tapaan kuin normaalisti luokalle luotavat rajapinnat. Sen sisällä määritellään metodit, jotka sen käyttöön ottavan luokan täytyy toteuttaa. Luokka voi ottaa käyttöön useita eri protokollia, mutta sen tulee toteuttaa niiden kaikkien määrittelemät metodit. 7

4 Objective-C vs. C++ Lähin vertailukohde Objective-C:lle on toinen C:tä olio-ohjelmointiin laajentanut kieli C++. Kielet eroavat kuitenkin suuresti siinä, miten ne ovat tämän toteuttaneet. Objective-C toi olio-ohjelmoinnin C:hen käyttäen olioiden välistä viestinvälitystä. C++ puolestaan käyttää olioiden kutsumiseen niiden metodeja. C++:ssa metodi sidotaan luokkaan kääntämisen yhteydessä. Objective-C:ssä sidonta tapahtuu ajon aikana. Käännösaikaisen sidonnan käyttäminen on ohjelman suorituksen kannalta nopeampaa. Dynaamisen sidonnan etuna on kuitenkin se, että viestin vastaanottajaa ei tarvitse tietää, eikä täydy olla varma että vastaanottajalla on kyky käsitellä viestiä. Tämän avulla voidaan esimerkiksi lähettää viestejä isolle joukolle olioita, joista kaikki eivät välttämättä osaa käsitellä viestiä. Viestin vastaanottajan täytyy kuitenkin osata käsitellä tapaus, jossa se saa viestin jonka toiminnallisuutta se ei toteuta. Muuten tapahtuu ajonaikainen virhe ja suoritus voi keskeytyä. Objective-C++ on yritys tuoda C++:aan samat ominaisuudet, jotka Objective-C lisäsi C:hen. 8

Lähteet [1] http://rypress.com/tutorials/objective-c/introduction [2] http://www.technobuffalo.com/2011/03/27/introduction-to-ios-development-an-overview-of-objective-c/ [3] http://www.techotopia.com/index.php/the_history_of_objective-c [4] https://www.binpress.com/tutorial/objectivec-a-brief-history/37 [5] https://www.binpress.com/tutorial/learn-objectivec-objects-part-8-dynamic-typing/68 [6] http://www.techotopia.com/index.php/objective-c_dynamic_binding_and_typing_with_the_id_type [7] https://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/articles/memo rymgmt.html [8] http://code.tutsplus.com/tutorials/objective-c-succinctly-memory-management--mobile-21996 [9] http://blog.imaginea.com/message-forwarding-and-surrogate-objects-in-objective-c/ [10] http://blog.paulopoiati.com/2009/12/05/forwarding-objective-c-messages/ [11] https://developer.apple.com/library/ios/documentation/cocoa/conceptual/programmingwithobjectivec/ CustomizingExistingClasses/CustomizingExistingClasses.html 9