Utforsk stiftelsens rammeverk

Stiftelsens rammeverk er brød og smør i verktøykassen til en iOS-utvikler. Det gir NSObject rotklasse og et stort antall grunnleggende byggesteiner for iOS-utvikling, fra klasser for tall og strenger, til arrays og ordbøker. Stiftelsens rammeverk kan virke litt kjedelig i begynnelsen, men det utnytter mye makt og er uunnværlig når man utvikler IOS-applikasjoner.


Et Ord om Core Foundation

I forrige artikkel nevnte jeg kort Core Foundation og dets forhold til Foundation. Selv om vi ikke eksplisitt bruker Core Foundation-rammene i resten av denne serien, er det en god ide å være kjent med det og å vite hvordan det skiller seg fra grunnlagsrammen, som du vil bruke mye.

Mens rammeverket er implementert i Mål-C, er Core Foundation-rammen basert på C-språket. Til tross for denne forskjellen implementerer Core Foundation-rammen en begrenset objektmodell. Denne objektmodellen tillater definisjon av en samling av ugjennomsiktige typer som ofte refereres til som objekter - til tross for at de strengt sett ikke er objekter.

Det primære målet for begge rammebetingelser er tilsvarende, slik at data og kode kan deles mellom de ulike biblioteker og rammebetingelser. Core Foundation inkluderer også støtte til internasjonalisering. En nøkkelkomponent av denne støtten er gitt gjennom CFString ugjennomsiktig type, som effektivt styrer en rekke Unicode-tegn.

Som nevnt tidligere, bringer tollfri brobygging bokstavelig talt broen mellom begge rammene ved å muliggjøre utskifting av kakaoobjekter for Core Foundation-objekter i funksjonsparametere og omvendt.

Det er viktig å merke seg at automatisk referansetelling (ARC) ikke klarer Core Foundation-objekter, noe som betyr at du er ansvarlig for å administrere minne når du arbeider med Core Foundation-objekter. Det er en god artikkel av Mike Ash om automatisk referanse telling og hvordan du bruker ARC med Core Foundation og gratis-bro.

Gå til Mac Developer Library for en komplett liste over de ugjennomsiktige typene som er inkludert i Core Foundation-rammeverket.


Øvelse, Øvelse, Øvelse

Å lære en ny ferdighet gjøres best gjennom praksis, så opprett et nytt prosjekt i Xcode og velg Kommandolinjeverktøy prosjektmal som vi gjorde tidligere i denne serien. Kommandolinjeverktøysmalen finnes i applikasjon kategori i OS X seksjon. Klikk neste å fortsette.

Gi det navnet på det nye prosjektet Fundament og skriv inn et organisasjonsnavn og bedriftsidentifikator. For dette prosjektet er det nøkkelen til å sette prosjekttype til Fundament. Fortell Xcode hvor du vil lagre prosjektet og trykke Skape.

Prøvekjøring

Vår lekeplass for resten av denne artikkelen vil være main.m og Xcode-konsollvinduet. Åpen main.m ved å velge den i Prosjektnavigator i venstre sidefelt og sørg for at konsollvinduet er synlig ved å klikke på midtknappen til Utsikt kontroll i Xcode verktøylinjen.

Klikk på Løpe knappen øverst til venstre for å bygge og kjøre den nåværende ordningen. Hvis alt gikk bra, bør du se Hei Verden! vises i konsollvinduet nederst.


Stiftelsesrammen

Stiftelsens rammeverk er mye mer enn en samling av klasser for å arbeide med tall, strenger og samlinger (arrays, ordbøker og sett). Det definerer også dusinvis av protokoller, funksjoner, datatyper og konstanter.

I resten av denne artikkelen vil jeg primært fokusere på klassene som du bruker oftest når du utvikler IOS-applikasjoner. Men jeg vil også kort snakke om tre viktige protokoller definert av stiftelsens rammeverk, NSObject, NSCoding, og NSCopying.

Header Files

Som du allerede vet, definerer topptekstfilen til en klasse grensesnittet. Betyr det at du må importere headerfilen til hver grunnklasse som du planlegger å bruke? Svaret er ja og nei.

Det er faktisk nødvendig å importere headerfilen til en klasse før du kan bruke den. Du gjør det ved å legge til en importerklæring som vi så tidligere i denne serien. Stiftelsesrammen gir imidlertid en enkel måte å lette denne prosessen på. Den eneste filen du trenger å importere er Foundation.h som vist i følgende kodestykke.

#importere ;

Bak kulissene importerer stiftelsesrammen alle nødvendige header-filer for å gi deg tilgang til hver klasse, protokoll, funksjon, datatype og konstant av stiftelsens rammeverk.

importerer

Når du oppretter et nytt prosjekt i Xcode, og du setter prosjekttypen til Fundament, Xcode vil:

  • lenke prosjektet mot stiftelsens rammeverk
  • legg til ovennevnte importoppgave til main.m
  • legg til ovennevnte importoppgave i prosjektets forkompilerte headerfil (* .pch)

Åpen main.m for å bekrefte dette og utvide rammeverkmappen i Prosjektnavigator ved å klikke på den lille trekant på venstre side. Jeg vil se den forkompilerte headerfilen og dens formål når vi tar en titt på UIKit-rammen.

protokoller

Flere språk, som Perl, Python og C ++, gir støtte til flere arv, noe som betyr at en klasse kan synke-være en underklasse av mer enn en klasse.

Selv om Objective-C ikke gir støtte til flere arv, støtter den flere arv gjennom spesifikasjon i form av protokoller. Hva betyr dette? I stedet for å arve fra en klasse, definerer en protokoll en liste over metoder som klasser implementerer hvis de overholder protokollen.

En protokoll kan ha krevd og valgfrie metoder. Hvis en klasse ikke implementerer alle nødvendige metoder for en protokoll, vil kompilatoren kaste en feil.

Fordelene med protokoller er mangfoldige. Når en klasse vedtar eller samsvarer med en protokoll, forventes klassen å implementere (påkrevde) metoder som er angitt i protokollen.

Mål-C protokoller ligner veldig grensesnitt i Java. Dette betyr at en protokoll kan brukes til å erklære grensesnittet til en gjenstand uten å avsløre objektets klasse.

Flere arv har sine fordeler, men det har absolutt sine ulemper. Fordelen med protokoller er at ikke-relaterte klasser fortsatt kan dele lignende oppførsel ved bruk av protokoller.

NSObject

I tillegg til det NSObject rotklassen definerer stiftelsesrammen også a NSObject protokoll. Objekter som samsvarer med NSObject protokollen kan bli spurt om sin klasse og superklasse, kan sammenlignes med andre objekter, og svare på selv- som vi så i artikkelen om Objective-C. Dette er bare en liten delmengde av oppførelsen som er lagt til i objekter som samsvarer med NSObject protokollen.

NSCoding

Objekter som samsvarer med NSCoding protokollen kan kodes og dekodes. Dette er nødvendig for objekter som må arkiveres eller distribueres. Objektarkivering skjer når en objekt- eller objektgraf er lagret på disk, for eksempel.

NSCopying

De NSCopying protokollen erklærer bare en metode, copyWithZone:. Hvis en klasse skal understøtte kopieringsobjekter, må den være i overensstemmelse med NSCopying protokoll. Kopiering av et objekt gjøres ved å sende det en melding av kopiere eller copyWithZone:.


NSObject

De NSObject klassen er rotklassen av det store flertallet av Objektiv-C-klassehierarkiene. Husker du at vi instanserte en forekomst av Bok klasse tidligere i denne serien? Vi sendte Bok klasse en melding av Alloc og vi sendte det resulterende objektet en melding av i det. Begge metodene er deklarert i NSObject klasse.

Ved å arve fra NSObject rotklasse, objekter vet hvordan man oppfører seg som objektiv-C objekter og hvordan man grensesnittet med objektiv-C-kjøretiden. Det bør ikke være en overraskelse som NSObject samsvarer med NSObject protokoll som vi så tidligere.

Fjern NSLog uttalelse i main.m og lim inn følgende kodebit i stedet.

NSObject * myFirstObject = [[NSObject alloc] init]; NSLog (@ "Klasse>% @", [minFirstObject klasse]); NSLog (@ "Superclass>% @", [myFirstObject superclass]); NSLog (@ "Overholder protokoll>% i", [myFirstObject conformsToProtocol: @protocol (NSObject)]);

Vi starter med å instansere en forekomst av NSObject og lagre en referanse til den i myFirstObject variabel. I den andre linjen logger vi klassenavnet til det nye objektet til konsollen. De klasse metode, returnerer en forekomst av NSString, en strengobjekt, som er grunnen til at vi bruker % @ format spesifiserer i NSLog uttalelse.

Deretter spør vi myFirstObject for sin superklasse og slutt ved å verifisere det myFirstObject samsvarer med NSObject protokoll. Er du forvirret av @protocol (NSObject)? Dette er ikke noe mer enn en referanse til NSObject protokollen.

Klikk Løpe og inspiser utgangen i konsollvinduet. Er du overrasket over produksjonen? Fordi NSObject er en rotklasse, den har ikke en superklasse.


NSNumber

De NSNumber klassen er en verktøysklasse som administrerer noen av de grunnleggende numeriske datatyper. Det er en underklasse av NSValue klassen, som gir et objektorientert innpakning for skalarer, samt peker, strukturer og objekt ids. De NSNumber klassen definerer metoder for å hente verdien den lagrer, for å sammenligne verdier, og også for å hente en strengrepresentasjon av den lagrede verdien.

Husk at verdien hentet fra en NSNumber forekomsten må være konsistent med verdien som ble lagret i den. De NSNumber klassen vil forsøke å konvertere den lagrede verdien dynamisk til den forespurte typen, men det er selvsagt at det er begrensninger som er knyttet til datatyper som NSNumber kan klare.

La meg illustrere dette med et eksempel. Legg til følgende kodestykke til main.m.

NSNummer * myNumber = [NSNummer nummerWithDouble: 854736e + 13]; NSLog (@ "Dobbel verdi>% f", [myNumber doubleValue]); NSLog (@ "Float Value>% f", [myNumber floatValue]); NSLog (@ "Int Value>% i", [minNumber intValue]);

Vi starter med å skape en ny NSNumber eksempel ved å passere a dobbelt verdi til numberWithDouble:. Deretter henter vi den lagrede verdien ved hjelp av tre forskjellige NSNumber metoder. Resultatene gjenspeiler ikke verdien som er lagret i Nummeret mitt av åpenbare grunner.

Leksjonen er enkel, være konsekvent når du bruker NSNumber ved å holde oversikt over typen som er lagret i NSNumber forekomst.


NSString

Forekomster av NSString klasse administrere en rekke av unichar tegn som danner en streng av tekst. Den subtile men viktige forskjellen med en vanlig C-streng, som styrer røye tegn, er det a unichar tegn er et multibyte tegn.

Som navnet antyder, a unichar tegn er ideelt egnet til å håndtere Unicode-tegn. På grunn av denne gjennomføringen, NSString klassen gir ut-av-boks-støtte for internasjonalisering.

Jeg vil understreke at strengen styres av en NSString eksempel er uforanderlig. Dette betyr at når strengen er opprettet, kan den ikke endres. Utviklere som kommer fra andre språk, som PHP, Ruby eller JavaScript, kan bli forvirret av denne oppførselen.

Stiftelsens rammeverk definerer også en gjensidig underklasse av NSString, NSMutableString, som kan endres etter at den er opprettet.

Det finnes ulike måter å lage strengobjekter på. Den enkleste måten å opprette en strengobjekt på er å ringe string metode på NSString klassen, som returnerer et tomt strengobjekt. Ta en titt på klassen referansen til NSString for en komplett liste over initiativer.

En annen vanlig vei for å lage strengobjekter er gjennom streng-bokstaver som vist i eksemplet nedenfor. I dette eksemplet er en bokstavlig streng tilordnet someString variabel. På kompileringstid vil kompilatoren erstatte strengen bokstavelig med en forekomst av NSString.

NSString * string1 = @ "Dette er en streng bokstavelig.";

De NSString klassen har en rekke forekomster og klassemetoder for å skape og manipulere strenge, og du vil sjelden, uansett, føle behovet for underklasse NSString.

La oss utforske NSString og dens mutable underklasse, NSMutableString, ved å legge til følgende utdrag til main.m.

NSString * string1 = @ "Dette er en streng bokstavelig."; NSString * string2 = [[NSString alloker] initWithFormat: @ "Strings kan opprettes på mange måter."]; NSMutableString * mutableString = [[NSMutableString alloker] initWithString: string1]; [mutableString appendFormat: @ "% @", streng2]; NSLog (@ "% @", mutableString);

Vi starter med å lage et strengobjekt ved hjelp av en streng bokstavelig. I den andre linjen lager vi en ny streng ved å bruke en av de spesialiserte initiativtakerne som NSString gir. En muterbar streng blir da opprettet ved å sende den første strengen som et argument. For å illustrere at mutable strenger kan modifiseres etter opprettelsen, string2 er lagt til den mutable strengen og logget til konsollvinduet.


NSArray og NSSet

De NSArray klassen administrerer en uforanderlig, bestilt liste over objekter. Stiftelsens rammeverk definerer også en gjensidig underklasse av NSArray, NSMutableArray. De NSArray klassen oppfører seg veldig mye som en C-matrise med forskjellen som en forekomst av NSArray styrer objekter. I tillegg, NSArray erklærer et bredt spekter av metoder som letter arbeid med arrays, for eksempel metoder for å finne og sortere objekter i arrayet.

Det er viktig å forstå at forekomster av NSArray, NSSet, og NSDictionary Kan bare lagre objekter. Dette betyr at det ikke er mulig å lagre skalare typer, pekere eller strukturer i noen av disse samlingsklassene - eller deres underklasser - kompilatoren vil kaste en feil hvis du gjør det. Løsningen er å vikle skalar typer, pekere og strukturer i en forekomst av NSValue eller NSNumber som vi så tidligere i denne artikkelen.

Legg til følgende kodestykke til main.m å utforske NSArray og dens mutable motpart, NSMutableArray.

NSArray * myArray = [NSArray arrayWithObjects: @ "Brød", @ "Smør", @ "Melk", @ "Egg", null]; NSLog (@ "Antall elementer>% li", [myArray count]); NSLog (@ "Objekt i indeks 2>% @", [myArray objectAtIndex: 2]); NSMutableArray * myMutableArray = [NSMutableArray arrayWithObject: [NSNummer nummerWithInt: 265]]; [myMutableArray addObject: [NSNummer nummerWithInt: 45]]; NSLog (@ "Mutable Array>% @", myMutableArray);

I første linje lager vi en matrise ved å bruke arrayWithObjects: klassemetode. Denne metoden aksepterer et variabelt antall argumenter-objekter - med det siste argumentet som er nil-som ikke er inkludert i matrisen. I den andre og tredje linjen spør vi arrayet for antall objekter i arrayet og objektet som er lagret på indeksen 2 henholdsvis.

Fordi NSMutableArray arver fra NSArray, det oppfører seg på samme måte som NSArray. Hovedforskjellen er at objekter kan legges til og fjernes fra matrisen etter at den er opprettet.

Før jeg går videre, vil jeg si noen ord om NSSet. Denne klassen ligner på NSArray, men de viktigste forskjellene er at samlingen av objekter som et sett håndterer er uordnet og duplikater er ikke tillatt.

Fordelen med NSSet er det å spørre om objekter er raskere hvis du bare trenger å vite om et objekt er inneholdt i settet. Stiftelsens rammeverk definerer også NSOrderedSet. Forekomster av denne klassen har fordelene med NSSet, men følg også posisjonen til hvert objekt.


NSDictionary

Ordbøker er, som arrays, et vanlig konsept i de fleste programmeringsspråk. I Ruby, for eksempel, er de referert til som hashes. Det grunnleggende konseptet er enkelt, en ordbok styrer en statisk samling av nøkkelverdige par eller oppføringer.

Som i Ruby hashes, trenger ikke nøkkelen til en oppføring å være en strengobjekt i seg selv. Det kan være en hvilken som helst type objekt som samsvarer med NSCopying protokoll så lenge nøkkelen er unik i ordboken. I de fleste tilfeller anbefales det imidlertid å bruke strengobjekter som nøkler.

Ordbøker kan ikke lagre nullverdier som arkiver. Hvis du vil representere en nullverdi, kan du bruke NSNull. De NSNull Klassen definerer et singleton-objekt som brukes til å symbolisere nullverdier i arrays, ordbøker og sett.

Singleton-mønsteret er et viktig mønster i mange programmeringsspråk. Det begrenser instantiation av en klasse til en gjenstand. Du vil håndtere singleton objekter ofte når du utvikler IOS applikasjoner.

Som NSArray, Stiftelsesrammen definerer en gjensidig underklasse av NSDictionary, NSMutableDictionary. Det finnes ulike måter å ordne en ordbok på. Ta en titt på følgende kodestykke.

NSString * keyA = @ "myKey"; NSString * keyB = @ "myKey"; NSDictionary * myDictionary = [NSDictionary DictionaryWithObject: @ "Dette er en streng bokstavelig" forKey: keyA]; NSLog (@ "% @", [myDictionary objectForKey: keyB]);

Vi erklærer først to separate strengobjekter som inneholder samme streng. I den tredje linjen ordner vi en ordbok ved å ringe dictionaryWithObject: Forkey: metode på NSDictionary klasse.

Deretter spør vi ordboken for objektet som er knyttet til innholdet i kEYB og logg det på konsollen.

Det er viktig å være oppmerksom på detaljene. Selv om vi brukte Keya som nøkkelen til nøkkelverdierparet og kEYB som nøkkelen til å hente verdien eller objektet til nøkkelverdi-paret, ga ordlisten oss det riktige objektet. De NSDictionary klassen er smart nok til å vite at vi vil at objektet er forbundet med streng nøkkelen min. Hva betyr dette? Selv om objektene Keya og kEYB er forskjellige objekter, strengen de inneholder er det samme og det er nettopp hva NSDictionary klassen bruker for å referere til objektet.

Følgende kodefragment viser at en ordliste kan inneholde en annen ordbok eller en rekkefølge, og det viser også hvordan man arbeider med gjensidige ordbøker.

NSMutableDictionary * myMutableDictionary = [NSMutableDictionary ordbok]; [myMutableDictionary setObject: myDictionary forKey: @ "myDictionary"]; NSLog (@ "% @", myMutableDictionary);

Objektiv-C-litteratur

Tidligere i denne artikkelen introduserte jeg deg til Objective-C-streng bokstaver, for eksempel @ "Dette er en streng bokstavelig.". De tar formen av en C-streng bokstavelig prefiks med en @ skilt. Som du sikkert vet ved nå, @ tegn indikerer at vi går inn i mål-C territorium.

En objektiv-C-bokstav er ikke noe mer enn en blokk med kode som refererer til et objektiv-C-objekt. Med utgivelsen av Xcode 4.5 kan du nå også bruke Objective-C-bokstaver for NSNumber, NSArray, og NSDictionary. Ta en titt på følgende kodestykke for å se hvordan dette fungerer.

NSNummer * oldNumber1 = [NSNummer nummerWithBool: JA]; NSNummer * newNubmer1 = @YES; NSNummer * oldNumber2 = [NSNummer nummerWithInt: 2147]; NSNummer * newNubmer2 = @ 2147; NSArray * oldArray = [NSArray arrayWithObjects: @ "one", @ "two", @ "three", null]; NSArray * newArray = @ [@ "one", @ "two", @ "three"]; NSDictionary * oldDictionary = [NSDictionary DictionaryWithObject: [NSNummer nummerWithInt: 12345] forKey: @ "key"]; NSDictionary * newDictionary = @ @ "-tasten": @ 12345;

Ikke bare er mål-C-bokstaver kule og sexy, de gjør også koden din mer lesbar. Mark Hammonds skrev en opplæring om Objective-C-bokstaver. Les Marks innlegg for en mer fullstendig oversikt over mål-C-bokstaver.


Logg på med NSLog

I denne artikkelen har vi gjentatte ganger brukt NSLog funksjon, som er definert av stiftelsens rammeverk. NSLog aksepterer et variabelt antall argumenter med det første argumentet som er en streng bokstavelig. Strengen bokstavelig kan inneholde format spesifiserer som erstattes av ekstra argumenter overført til NSLog funksjon.

NSLog (@ "% @ -% i -% f", @ "en gjenstand", 3, 3,14);

Gå til Mac Developer-biblioteket for en komplett liste over formatspecifikatorer som kan brukes.


Konklusjon

Selv om vi har dekket mye bakken i denne artikkelen, har vi knapt skrapt overflaten av hva rammeverket har å tilby.

Det er ikke nødvendig å vite detaljene i hver klasse eller funksjon som er definert i stiftelsesrammen for å komme i gang med iOS-utvikling, skjønt. Du lærer mer om Foundation-rammen når du undersøker iOS SDK.

I den neste artikkelen vil vi utforske UIKit-rammeverket, og jeg vil også diskutere inn-og utgangene til et iOS-program.