Getting gang med Objective-C
2
Del
5
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Lær iOS SDK Development Fra Scratch.Learning C:. En PrimerExploring iOS SDK
Innledning
Med det grunnleggende C fortsatt friskt i hukommelsen, er det på tide å bli kjent med Objective-C. Den største forskjellen med C er at Objective-C er et objektorientert programmeringsspråk, mens C er en prosessuell programmeringsspråk. Dette betyr at vi først må forstå objekter og hvordan de forholder seg til klasser. Andre viktige begreper som vi vil utforske i denne artikkelen er gjenstand messaging, innkapsling og arv.
Opprinnelsen til Objective-C
Objective-C og Cocoa er to viktige komponenter i iOS-plattformen. Til tross for at iOS-plattformen er fortsatt relativt ung, ble Objective-C opprettet i begynnelsen av 1980-tallet på Stepstone av Brad Cox og Tom Love. Språket ble opprettet i et forsøk på å kombinere robust og fleksibelt programmeringsspråket C med elegant Smalltalk språk. Objective-C er en streng supersett av C og, i motsetning til C, er det et høyt nivå programmeringsspråk. Hovedforskjellen mellom C og Objective-C er at sistnevnte er et objektorientert programmeringsspråk, mens C er en prosessuell programmeringsspråk.
Hvordan fikk iOS ende opp med å bruke et språk som ble utviklet på 1980-tallet? Kort tid etter NeXT ble grunnlagt av Steve Jobs, det lisensierte Objective-C fra Stepstone. NeXT opprettet Nextstep, et brukergrensesnitt verktøykasse for de neste operativsystem utviklet i Objective-C. Selv om Nextstep ga en revolusjonerende sett med verktøy, fikk NeXT operativsystemet bare litt trekkraft i markedet. I 1996 kjøpte Apple NeXT og Nextstep ble Cocoa. Sistnevnte gikk mainstream med innføringen av OS X mars 2001 og senere med utgivelsen av iPhone og iOS operativsystem.
Objektorientert programmering
I prosedyreorientert programmering, en Programmet består av en rekke prosedyrer eller rutiner som blir eksekvert for å nå en bestemt tilstand. I objektorientert programmering, men en samling av objekter samhandle og arbeide sammen for å fullføre en oppgave. Selv om det endelige resultatet kan være identiske, metodikk og underliggende paradigmer er vesentlig forskjellige. Modularitet og kode gjenbruk er to av de viktigste fordelene med objektorientert programmeringsspråk som vi snart vil se.
Objective-C, Cocoa, og Cocoa Touch
Utviklere nytt for iOS og OS X økosystemer ofte bli forvirret av forholdet mellom Objective-C, Cocoa (OS X), og Cocoa Touch (iOS). Hva er Cocoa Touch og hvordan forholder det til Objective-C? Kakao er Apples eget programmeringsgrensesnitt (API) for iOS og OS X plattformer. Objective-C er språket som driver Cocoa. Selv om denne artikkelen fokuserer primært på Objective-C programmeringsspråk, vil vi ta en nærmere titt på Cocoa og Cocoa Touch API-er senere i denne serien.
Klasser, objekter og forekomster
< p> En annen snublestein for utviklere nye i objektorientert programmering er skillet mellom klasser, objekter og instanser. En klasse er en støpt eller blåkopi for å lage objekter, mens forekomstene er unike forekomster av en klasse. Et objekt er en datastruktur som har en tilstand og oppførsel. På tross av den subtile forskjellen mellom objekter og instanser, er begge begrepene ofte brukes om hverandre
La oss ta en titt på et eksempel:. Brødristere. Før en brødrister er produsert, ingeniører lage en blåkopi, som tilsvarer en klasse. Hver brødrister opprettet fra blåkopi er en forekomst eller en unik forekomst av klassen. Selv om hver brødrister er opprettet fra samme blåkopi (klasse), de har hver sin egen stat (farge, antall plasser, etc.) og atferd.
instansvariabler og Innkapsling
tilstand en forekomst er lagret i og definert av sine instansvariabler, eller objektets attributter hvis du vil. Dette bringer oss til en annen nøkkel mønster av objektorientert programmering: innkapsling
. Innkapsling innebærer at den interne representasjon av et objekt er privat og bare kjent for selve objektet. Dette kan virke som en alvorlig begrensning ved første øyekast. Imidlertid er resultatet modulær og løst koplet kode.
La oss illustrere innkapsling med et annet eksempel. Hastigheten på en bil måles ved bilens innvendige, men sjåføren kjenner hastigheten på bilen ved å se på speedometeret. Føreren trenger ikke å vite om eller forstå bilens innvendige vite hastigheten på bilen. Likeledes gjør bilføreren ikke trenger å forstå hvordan motorer arbeid for å være i stand til å kjøre bilen. Detaljene om hvordan en bil fungerer er skjult fra sjåføren. Staten og oppførsel av bilen er skjult fra sjåføren og er tilgjengelig gjennom bilens grensesnitt (ratt, bremsepedal, dashbord, etc.).
Arv
Et annet kraftig paradigmet av objekt orientert programmering er klassen arv. Når klasse A er en underklasse av klasse B, klasse A arver egenskaper og oppførsel av klasse B. Klasse B sies å være den overordnede klassen eller super av klasse A. Arv fremmer også kode gjenbruk og modularitet.
metoder og egenskaper
metoder er underrutiner i forbindelse med en klasse og de definerer oppførselen til en klasse og dens forekomster. Metodene for en klasse har tilgang til de innvendige av en forekomst og kan dermed endre statusen for eksempel. Med andre ord, er tilstanden til en instans (dvs. objektvariabler) styres av metodene for en instans (dvs. instansmetoder).
På grunn av innkapsling mønster, instansvariabler i en klasse eksempel kan ikke nås fritt. I stedet blir de vist gjennom kundeskaffere og settere, metoder med det formål å få og sette instansvariabler. Egenskaper er en funksjon i Objective-C som gjør etableringen av accessors (kundeskaffere og settere) trivielt. Til tross for nytten av accessors, blir det fort tungvint å skrive tilgangsmetoder for hver forekomst variabel. Vi vil utforske egenskaper i mer detalj senere i denne artikkelen. For nå vurdere egenskaper som pakkere rundt instansvariabler som gjør det lettere å jobbe med instansvariabler gjennom kundeskaffere og settere.
Learning by Eksempel
La oss sette vår kunnskap i praksis ved å skape en ny Xcode prosjekt å jobbe med. Opprett et nytt prosjekt i Xcode ved å velge New > Prosjekt ...
fra Fil-menyen.
Som vi gjorde i den forrige artikkelen, velg Command Line Tool prosjektet mal i programkategori under OS X delen.
Set Produktnavn til bøker og gi prosjektet en organisasjon navn og selskap identifikator. For dette prosjektet, er det viktig å sette prosjektet typen til Foundation. Bakgrunnen for dette valget vil bli klart senere i denne artikkelen.
Fortell Xcode hvor du vil lagre prosjektet og klikk på Opprett-knappen. Du kan legge merke til at prosjektet ser annerledes ut enn det prosjektet vi skapt for å lære C. La oss ta et øyeblikk å se hva forskjellene er.
Prosjektoversikt
Prosjektet inneholder noen flere filer og mapper enn kommandolinjeverktøyet vi skapte i den forrige artikkelen. I tillegg til main.m og Books.1, er det to nye mapper, Støtte Filer og Frameworks, som hver inneholder ett element.
Støtter filer inneholder en fil som heter Books-Prefix.pch. Den .pch filtype forteller oss at dette er en ferdigbygd header fil. Dens formål vil bli klart senere i denne serien.
Strukturer mappen inneholder rammer som prosjektet er knyttet mot. Hva er et rammeverk? Et rammeverk er en bunt eller en katalog som inneholder et bibliotek inkludert sine ressurser, for eksempel bilder og header filer. Konseptet med en header fil vil bli klart i løpet av et minutt. Rammene mappe inneholder ett element, Foundation.framework.
Når du oppretter prosjektet, setter du den prosjekttype til stiftelsen, som betyr at prosjektet er knyttet mot Foundation rammeverket. Stiftelsen rammeverket er et grunnleggende sett med Objective-C klasser. Senere i denne serien, vil vi ta en nærmere titt på Foundation rammeverket.
Lag en klasse
Det er på tide å lage din første klasse. Når du oppretter en ny fil ( Fil > New > Fil ...
), blir du presentert med en liste over fil maler. Velg Cocoa fra OS X-delen og velger Objective-C-klasse mal for å opprette en ny Objective-C-klassen. Klikk på Neste for å fortsette.
Gi den nye klassen et navn på bok og sette underklasse til NSObject. Som vi så tidligere, ved å gjøre den nye klassen en underklasse av NSObject, vil den nye klassen arver egenskaper og atferd av NSObject. Dette betyr at den nye Book klasse får noen funksjonalitet for gratis.
Klikk på Neste for å fortsette og fortelle Xcode hvor du vil lagre den nye klassen. Sørg for å lagre den nye klassen et sted i Xcode prosjekt.
Xcode har lagt til to nye filer til prosjektet, Book.h og Book.m. Book.h er topptekstfilen av boken klassen og eksponerer klassen grensesnittet som vi så tidligere. En klasse grensesnitt inneholder egenskapene og metodene i klassen, og det også angir klassens superklasse. Book.m er gjennomføringen fil av klassen og definerer sin atferd ved å implementere metoder deklarert i klassen header fil.
Header File
Åpne Book.h og utforske dens innhold. Bortsett fra noen kommentarer på toppen, inneholder header filen bare tre linjer med kode. Den første linjen importerer header fil av stiftelsen rammeverket. Dette sikrer at boken klassen har tilgang til klassene og protokoller deklarert i stiftelsen rammeverket
#import. ≪ Foundation /Foundation.h >
Den andre og tredje linje danner et par. I Objective-C, begynner hver klasse grensesnitt medinterface og ender medend, som begge er kompilatordirektiver, det vil si kommandoer eller instruksjoner for kompilatoren. Deninterface direktivet er etterfulgt av navnet på klassen, et kolon, og klassens superklasse-eventuelt. Som vi så tidligere, den overordnede klassen eller super er den klassen som det arver attributter og atferd
interface Bok:. NSObject @ slutten
NSObject er roten klasse for flertallet av Objective-C klasser. De to første bokstavene, NS, henviser til sin opprinnelse, Nextstep, som vi så tidligere i denne artikkelen. Ved å arve fra NSObject, klasser oppføre seg som Objective-C klasser, og arve en grunnleggende grensesnitt til runtime systemet.
Implementering File
Før vi gjør endringer på Book klassen, la oss ta en rask topp på Book.m, klassen implementering fil. I stedet for å importere Foundation rammeverk, importerer gjennomføringen filen header fil av boken klassen. Hvorfor er dette nødvendig? Gjennomføringen filen må vite hvilke egenskaper og metoder er deklarert i topptekstfilen før den kan iverksette atferd (dvs. metoder) av klassen. Importen uttalelsen er etterfulgt av gjennomføringen av klassen, angitt medimplementation ogend.
Legge Egenskaper og metoder
The Book klassen er ikke veldig nyttig i sin nåværende gjennomføringen. Head over til header fil og legge til tre eiendommer år, tittel og forfatter, og legge til en metode som heter bookInfo.
Egenskaper er deklarert medproperty søkeord og kan bli erklært hvor som helst i klassensinterface blokken. Denproperty nøkkelordet er etterfulgt av den typen og navnet på eiendommen. Ikke glem stjerne foran tittel og forfatter egenskaper, fordi en Cocoa objektet er alltid referert som en peker
#import < Foundation /Foundation.h >interface Bok:. NSObject @ eiendom int år; @ Eiendommen NSString * tittel;property NSString * forfatter, - (NSString *) bookInfo;end
Metoden erklæring ligner litt en funksjon prototype, men det finnes en rekke viktige forskjeller. Metoden erklæring starter med et minustegn som indikerer at dette er en instansmetode. Klassemetoder innledes med et plusstegn. Minustegnet er etterfulgt av returtype av fremgangsmåten mellom parenteser, en forekomst av NSString, og navnet på fremgangsmåten. Metoden erklæring avsluttes med et semikolon.
Jeg er sikker på at du lurer på hva NSString er og hvorfor det er behov for å bli referert som en peker. Den NSString klassen er medlem av stiftelsen rammeverket. Det erklærer grensesnittet for et objekt som forvalter en uforanderlig streng. I den forrige artikkelen så vi at en streng i C kan være representert ved en rekke tegn og det er akkurat hva NSString klassen gjør, klarer den en rekke tegn under panseret. Fordelen med å bruke NSString er at det gjøre arbeidet med strenger mye enklere.
Implementing bookInfo
Nå som vi har erklært bookInfo metoden i klassen sin header fil, er det på tide å gjennomføre det i klassen implementering fil. Åpne Book.m og legge inn følgende kode eller annet sted iimplementation blokken. Før vi bryte gjennomføringen av bookInfo ned, må vi først snakke om objektet messaging Anmeldelser - (NSString *) bookInfo {NSString * bookInfo = [NSString stringWithFormat:. @ "% @ Ble skrevet av% @ og publisert i% i "self.title, self.author, self.year]; returnere bookInfo;}
Objekt Meldinger
Vi vet allerede at atferden til en klasse er definert gjennom sine metoder. Å kalle en metode på et objekt, sendes en melding til objektet. Inspiser følgende kode for å forstå dette konseptet. La oss bryte det ned linje for linje. I den første linjen, erklærer vi en ny streng og tilordne den en konstant streng ved å pakke strengen i anførselstegn og før det med en @ tegn
NSString * string = @ "Dette er en streng med tegn.";. Int lengde = [strenglengde]; NSLog (@ "Lengden på strengen er% i \\ n". lengde);
I den andre linjen, vi sender et budskap om lengden til strengen instans. Med andre ord, vi kaller metoden lengden på strengen forekomsten og metoden returnerer et heltall. Heltallet er tilordnet lengden variabel av typen int. I den siste linjen, logger vi lengden variabel til konsollen ved å kalle NSLog funksjon som vi så i forrige artikkel.
Sende meldinger til objekter er noe du vil gjøre mye, så det er viktig å forstå syntaks. Selv om syntaks ser merkelig hvis du er ny på Objective-C, er det ikke så vanskelig å forstå. Mellom hakeparenteser er objektet til venstre og melding eller metode navn til høyre for den
[objekt melding];.
Metoder som godtar argumentene ser litt annerledes ut, men den generelle syntaksen er identisk. Den NSString klasse, for eksempel, har en annen metode kalt substringFromIndex :. Tykktarmen ved slutten av navnet indikerer at denne metoden aksepterer et argument. Kalle denne metoden på en snor ser slik ut:
NSString * treng = [string substringFromIndex: 5];
Objective-C er kjent for sine lange og ordrik metodenavn. Ta en titt på følgende eksempel, som inkluderer et metodenavn med flere argumenter. Du må innrømme at navnet på metoden sier klart hva metoden gjør. Metodenavnet er delt i biter med hver klump akseptere et argument. Objekt messaging vil virkelig synke inn når vi begynner å arbeide med iOS SDK
NSString * anotherString = [string stringByPaddingToLength: 5 withString: @ "litt streng" startingAtIndex: 2];.
Før vi går videre, må vi revidere gjennomføringen av bookInfo. Fremgangsmåten starter ved å gjenta implementeringen av fremgangsmåten deklarasjon. Den etterfølgende semikolon er erstattet med et par klammeparentes, som festes rundt gjennomføringen av metoden. Vi erklærer først en ny streng, bookInfo, og tildele det en ny streng, laget med attributtene i vår bok instans (tittel, forfatter og år). På slutten av bookInfo metoden returnere vi den nye strengen, bookInfo, fordi det er det den metoden forventer, en streng som returtype.
Tre ting krever noen avklaring. Først metoden stringWithFormat: er en klasse metode og ikke en forekomst metode. Vi vet dette fordi metoden kalles på klassen selv, NSString, ikke på en forekomst av klassen. Klassemetoder er vanlig i objektorientert programmeringsspråk. For det andre er det formatet spesifiserendes for et objekt representert ved @ -symbolet (innledes med prosenttegnet). Både tittel og forfatter er objekter-strenger for å være presis. Tredje, selv søkeord refererer alltid klassen eksempel. I dette tilfellet refererer selv til Bok eksempel som fremgangsmåten bookInfo tilhører.
accessors Revisited
Hvis du har jobbet med andre objektorienterte språk, tilgang instansvariabler i Objective-C makt være forvirrende. Vi har ikke direkte tilgang til en instansvariabel når vi skriver self.title. Dette er noe mer enn en snarvei for [selvtillit tittel]. Sistnevnte betyr at vi bruker den getter metode for å be forekomsten for eksempel variabel kalt tittel. Det samme gjelder for innstilling av en variabel forekomst. Ta en titt på følgende kodebiten. Som du kan se, er bruken av self.title noe mer enn syntaktisk sukker
//Dette oppdraget ... self.title = @ "The Hobbit";. //... Tilsvarer ... [ ,,,0],selv setTitle: @ "The Hobbit"];
id, nil, og NULL
id
Før vi begynner å bruke boken klassen, jeg ønsker å snakke om noen søkeord som forvirrer folk fra tid til annen. Når du ønsker å lagre et objekt uten eksplisitt å definere hvilken type som objekt, bruker du den id datatype, som også er standardtypen for retur og argumenterklæringer for Objective-C metoder.
Strøm og nytten av id datatype går mye lenger, though. Id datatype er en nøkkelkomponent i Objective-C dynamiske typing og dynamisk binding. Det er viktig å forstå at id datatypen ikke holder noe informasjon om selve objektet annet enn at det er et objekt.
I Objective-C, vet hvert objekt hvilken klasse den tilhører (gjennom en isa variabel ), og dette er kritisk. Hvorfor det? En av styrkene til Objective-C er dens dynamisk typing, noe som betyr at typesjekking utføres under kjøring i stedet for kompilering.
Men siden id datatypen ikke fortelle kompilatoren noe om klassen objektet tilhører, selve objektet behov for å gi denne informasjonen til kompilatoren.
Husk at det er helt akseptabelt å statisk skrive et objekt i Objective-C ved å spesifisere et objekt klasse i stedet for å bruke id data type.
Dynamic Binding
Dette bringer oss til en annen viktig del av Objective-C runtime, dynamisk binding. I Objective-C, er en viktig forskjell mellom funksjoner og meldinger om at en melding og mottaks objektet ikke er bundet sammen til runtime.
Hva betyr dette og hvorfor er dette viktig? Dette betyr at fremgangsmåten startes som respons på en melding sendt til et objekt bestemmes under kjøring når både meldingen og objektet er kjent. Dette er det som kalles dynamisk binding.
nil og NULL
I Objective-C, er nøkkelordet null definert som et null objekt, det vil si en id med en verdi på 0. Under panseret er det ingen forskjell mellom null, Nil, og NULL, og det er mulig å sende meldinger til hver av dem uten unntak blir kastet.
Konvensjonen er å bruke null for objekter, Nil for klasser, og NULL ellers. Å kunne sende meldinger til null, Nil, og NULL har fordeler, men det har også ulemper. For mer informasjon om null, Nil, og NULL, ta en titt på dette spørsmålet på Stack Overflow.
Opprette objekter
Åpne main.m og legge en import uttalelse for å importere header fil av boken klassen. I stedet for å bruke vinkelparenteser, bruker vi doble anførselstegn for å importere header fil av boken klassen. Doble anførselstegn brukes til lokale filer, mens vinkelparenteser brukes for global omfatter, ved hjelp av prosjektets inkluderer banen
#import. ≪ Foundation /Foundation.h > #import "Book.h"
Umiddelbart under NSLog ringe, legge følgende kodebit å opprette en forekomst av boken klassen
Bok * book1 = [[Bestill Alloc] init];. book1.title = @ "The Hobbit"; book1.author = @ "JRR Tolkien"; book1.year = 1937;
I den første linjen, erklærer vi en variabel av typen Book og initialisere den. Dette er et godt eksempel for å illustrere nestede metodekall. Den første metoden kalles på Book klassen er Alloc. Detaljene i denne samtale, er ikke viktig. Kjernen er at minnet er tildelt for det nye objektet og objektet er opprettet.
På grunn av hekkende av samtalene, er init-metoden kalles på nytt objekt som ble opprettet av Alloc metoden. Init-metoden initialiserer nytt objekt, sette opp objektet og gjør den klar til bruk. Init metoden returnerer forekomsten og, i vårt eksempel, tildeler den til book1 variabel.
De neste tre linjene bør være kjent nå, setter vi tittel, forfatter, og publisering år av den nye boken.
La oss lage en annen bok og legge begge bøkene til en Objective-C array. Opprettelsen av den andre boken er ikke ny. Den eneste forskjellen er at vi har gjort eksplisitt bruk av klassens settere å angi instansvariabler av den nye forekomsten
Bok * book2 = [[Bestill Alloc] init] [book2 setTitle:. @ "Ringens Brorskap Ring "] [book2 setAuthor: @" JRR Tolkien "] [book2 setYear: 1 954]; NSArray * bøker = [[NSArray Alloc] initWithObjects: book1, book2, nil];
I den siste linjen skaper vi en forekomst av NSArray, en annen klasse av stiftelsen rammeverket. Den NSArray klassen er en matrise som kan lagre en ordnet liste over objekter. Akkurat som vi gjorde med boken tilfeller vi tildele minne og initial det nye utvalget.
I stedet for å kalle init, derimot, kaller vi initWithObjects :. initWithObjects: er et utpekt initializer, noe som betyr at det er en init-metoden med noen ekstra bjeller og fløyter for å lette objekt initialisering
initWithObjects. godtar en rekke objekter som du vil lagre i rekken. Listen over objekter bør alltid ender med null.
Blanding C og Objective-C
Jeg har allerede nevnt flere ganger at Objective-C er en streng supersett av C, og at vi kan fritt kombinere C og Objective-C. La oss se hvordan dette fungerer. Vi starter ved hjelp av en enkel hvis /annet uttalelse for å sjekke om tabellen inneholder noen gjenstander. Ved å sende rekken et budskap om telling, vil den returnere antallet objekter den inneholder.
Hvis tabellen inneholder objekter, bruker vi en for loop for å iterere over objektene i tabellen. Under hver iterasjon, ber vi matrisen for objektet på indeks i og sende den objekt en forekomst av boken klasse et budskap om bookInfo. Som vi så tidligere, returnerer bookInfo en forekomst av NSString, som vi logger til konsollen
if ([bøker telle] > 0). {For (int i = 0; i < [bøker telle]; i ++) {Bok * aboken = [bøker objectAtIndex: i]; NSLog (@ "% @", [aboken bookInfo]); }}
Konklusjon
Jeg er sikker på at du er litt overveldet av Objective-C. Dette er normalt. Selv om Objective-C er noe mer enn et tynt lag på toppen av C-språk, det er ganske mye å gå på.
Mens det er mer til Objective-C enn omtalt i denne artikkelen, du vet det grunnleggende og er klar til å begynne å jobbe med iOS SDK. I neste artikkel vil vi ta en titt på iOS SDK og utforske de ulike komponentene.