Utforske Foundation Framework

Exploring stiftelsen Work
Del
Del
6
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert å bare $ 3. Ikke gå glipp av.
Dette innlegget er en del av en serie som heter Lær iOS SDK Development Fra Scratch.Exploring iOS SDKFirst steg med UIKit

Stiftelsen rammeverket er det brød og smør i verktøykasse av en iOS-utvikler. Det gir NSObject rot klasse og et stort antall grunnleggende byggesteiner for iOS utvikling, fra klasser for tall og strenger, til arrays og ordbøker. Stiftelsen rammeverket kan virke litt kjedelig i begynnelsen, men det utnytter mye makt og er uunnværlig når utvikle iOS applikasjoner.



Et ord om Kjerne Foundation

I forrige artikkel jeg kort nevnt Core-stiftelsen og dens forhold til Foundation. Selv om vi ikke vil eksplisitt bruker Core Foundation rammeverket i resten av denne serien, er det en god idé å bli kjent med det og å vite hvordan det skiller seg fra stiftelsen rammeverk, som du vil bruke mye.

Mens Foundation rammeverket er implementert i Objective-C, er kjernen Foundation rammeverk basert på C-språk. Til tross for denne forskjellen, gjør Core Foundation rammeverket gjennomføre en begrenset objektmodellen. Dette objektet modellen gir mulighet for definisjonen av en samling av ugjennomsiktig typer som ofte omtales som objekter-til tross for at de er strengt tatt ikke stedene.

Det primære målet for begge rammer er lik, slik at deling av data og kode mellom de ulike biblioteker og rammeverk. Kjernen Foundation har også støtte for internasjonalisering. En viktig del av denne støtten gis gjennom CFString ugjennomsiktig type, som effektivt forvalter en rekke Unicode-tegn.

Som jeg nevnte tidligere, toll-free bridging bokstavelig talt bygger bro mellom begge rammer ved at substitusjon av kakao objekter for Kjerne Foundation objekter i funksjonsparametre og vice versa.

Det er viktig å merke seg at Automatic Reference Counting (ARC) ikke klarer Kjerne Foundation "objekter", som betyr at du er ansvarlig for å administrere minne når du arbeider med Kjerne Foundation "objekter". Det er en stor artikkel av Mike Ash om Automatic Reference Counting og hvordan du bruker ARC med Kjerne Foundation og toll-free bridging.

Besøk Mac Developer Library for en fullstendig liste over de ugjennomsiktige typene som inngår i kjerne Foundation rammeverk.



Practice, øve, øve

Å lære en ny ferdighet gjøres best gjennom praksis så opprette et nytt prosjekt i Xcode og velg Command Line Tool prosjekt mal som vi gjorde tidligere i denne serien. Den Command Line Tool malen kan bli funnet i programkategorien i OS X delen. Klikk på Neste for å fortsette.

navn det nye prosjektet Foundation og skriv en organisasjon navn og selskap identifikator. For dette prosjektet, det er nøkkelen til å sette prosjektet typen til Foundation. Fortell Xcode hvor du vil lagre prosjektet og traff Opprett.

Test Drive

Vår lekeplass for resten av denne artikkelen vil være main.m og Xcode konsollen vinduet. Åpne main.m ved å velge det i prosjekt Navigator i venstre sidebar og sørg for at konsollen vinduet er synlig ved å klikke den midterste knappen på Vis-kontroll i Xcode verktøylinjen.

Klikk på Kjør-knappen i øverst til venstre for å bygge og drive den nåværende ordningen. Hvis alt gikk bra, skal du se Hello, World! vises i konsollvinduet nederst.



Stiftelsen Work

Stiftelsen rammeverket er mye mer enn en samling av klasser for å jobbe med tall, strenger og samlinger (arrays, ordbøker, og sett). Den definerer også dusinvis av protokoller, funksjoner, datatyper, og konstanter.

I resten av denne artikkelen, vil jeg først og fremst fokusere på de klassene som du bruker oftest ved utvikling av iOS-applikasjoner. Imidlertid vil jeg også kort snakke om tre viktige protokoller definert av stiftelsen rammeverk, NSObject, NSCoding, og NSCopying.

Header filer

Som du allerede vet, topptekstfilen av en klasse definerer grensesnittet. Betyr det at du må importere tekstfilen for hver Foundation klasse som du har tenkt å bruke? Svaret er ja og nei.

Det er faktisk nødvendig å importere tekstfilen av en klasse før du kan bruke den. Du gjør dette ved å legge til et import uttalelse som vi så tidligere i denne serien. Imidlertid gir stiftelsen rammeverket en praktisk måte å forenkle denne prosessen. Den eneste fil du trenger å importere er Foundation.h som vist i følgende kodebiten
#import. ≪ Foundation /Foundation.h >;

Bak kulissene, grunnlaget ramme importen alle nødvendige header filer til gi deg tilgang til hver klasse, protokoll, funksjon, datatype, og konstant av stiftelsen rammeverket.

Importere

Når du oppretter et nytt prosjekt i Xcode og du sette prosjektet typen til Foundation , Xcode vil:

knytte prosjektet mot Foundation rammeverket

legg den over import uttalelse til main.m

legg den over import uttalelse til prosjektets forhåndskompilert header fil (* .pch)

Åpne main.m å bekrefte dette og utvide rammene mappen i prosjekt Navigator ved å klikke på den lille trekanten på sin venstre. Jeg vil komme tilbake til forhåndskompilert header-filen og dens formål når vi tar en titt på UIKit rammeverket.

Protokoller

Flere språk, for eksempel Perl, Python og C ++, gi støtte for multippel arv , noe som betyr at en klasse kan stige-være en underklasse av-mer enn én klasse.

Selv om Objective-C gir ikke støtte for multippel arv, gjør det støtter multippel 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 klassene gjennomføre dersom de er i samsvar med protokollen.

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

Fordelene med protokoller er mange. Når en klasse vedtar eller i samsvar med en protokoll, er klassen forventes å implementere (kreves) metoder deklarert i protokollen.

Objective-C protokoller er svært lik grensesnitt i Java. Dette betyr at en protokoll kan brukes til å erklære grensesnittet til et objekt uten å avsløre den klassen til objektet.

Multiple arv har sine fordeler, men det absolutt har sine ulemper. Fordelen med protokoller er at urelaterte klasser kan likevel dele lignende atferd gjennom bruk av protokoller.

NSObject

I tillegg til NSObject roten klasse, Stiftelsen rammeverket definerer også en NSObject protokollen. Objekter i samsvar med gjeldende 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 del av atferden lagt til objekter i samsvar med gjeldende NSObject protokollen.

NSCoding

Objekter i samsvar med gjeldende NSCoding protokollen kan kodes og dekodes. Dette er nødvendig for objekter som må arkiveres og distribueres. Objekt arkiv skjer når et objekt eller gjenstand grafen er lagret til disk, for eksempel.

NSCopying

NSCopying protokollen erklærer bare én metode, copyWithZone :. Hvis en klasse er å støtte kopiering objekter, må den samsvare med NSCopying protokollen. Kopiering et objekt gjøres ved å sende det et budskap om kopi eller copyWithZone :.



NSObject

NSObject klassen er roten klasse av det store flertallet av de Objective-C-klasse hierarkier . Husker du at vi startes en forekomst av boken klassen tidligere i denne serien? Vi sendte Book klassen et budskap om Alloc og vi sendte den resulterende objektet et budskap om init. Begge metodene er deklarert i NSObject klassen.

Ved å arve fra NSObject roten klasse, gjenstander vet hvordan de skal oppføre seg som Objective-C objekter og hvordan grensesnittet med Objective-C runtime. Det bør ikke være en overraskelse at NSObject overensstemmelse med NSObject protokollen som vi så tidligere.

Ta NSLog uttalelse i main.m og lim inn følgende kode i stedet.
NSObject * myFirstObject = [[NSObject Alloc] init]; NSLog (@ "Class >% @", [myFirstObject klasse]); NSLog (@ "Super >% @", [myFirstObject super]); NSLog (@ "Følger Protocol >% i ", [myFirstObject conformsToProtocol:protocol (NSObject)]);

Vi starter med Instantiating en forekomst av NSObject og lagre en referanse til det i myFirstObject variabel. I den andre linjen, vi logger klassen navnet på det nye objektet til konsollen. Klassen metoden returnerer en forekomst av NSString, en streng objekt, som er grunnen til at vi bruker% @ format Specifier i NSLog uttalelse.

Deretter ber vi myFirstObject for sin superklasse og ende ved å bekrefte at myFirstObject i samsvar med NSObject protokollen. Er du forvirret avprotocol (NSObject)? Dette er noe mer enn en referanse til NSObject protokollen.

Klikk Kjør og inspisere produksjonen i konsollen vinduet. Er du overrasket over resultatet? Fordi NSObject er en rot klasse, det har ikke en superklasse.



NSNumber

NSNumber klassen er et verktøy klasse som forvalter noen av de grunnleggende numeriske datatyper. Det er en underklasse av den NSValue klassen, som gir et objektorientert wrapper for skalare typer samt pekere, strukturer og objekt IDer. Den 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 eksempel må være i samsvar med den verdien som var lagret i den. Den NSNumber klassen vil forsøke å dynamisk konvertere den lagrede verdien til den forespurte typen, men det sier seg selv at det er begrensninger som ligger til datatyper som NSNumber kan håndtere.

La meg illustrere dette med et eksempel. Legg inn følgende kode til main.m.
NSNumber * myNumber = [NSNumber numberWithDouble: 854736e + 13]; NSLog (@ "Double Value >% f", [myNumber doubleValue]); NSLog (@ "Float Verdi >% f ", [myNumber floatValue]); NSLog (@" Int Value >% i ", [myNumber intValue]);

Vi starter med å lage en ny NSNumber eksempel ved å sende en dobbel verdi til numberWithDouble :. Neste, vi tar den lagrede verdien ved hjelp av tre ulike NSNumber metoder. Resultatene reflekterer ikke verdien som er lagret i myNumber for åpenbare grunner.

Lærdommen er enkel, være konsekvent når du bruker NSNumber ved å holde styr på den typen som er lagret i NSNumber eksempel.



NSString

forekomster av NSString klassen administrere en rekke unichar tegn danner en tekststreng. Den subtile, men viktig forskjell med en vanlig C-streng, som forvalter char tegn, er at en unichar karakter er en flerbytetegn.

Som navnet tilsier, en unichar karakter er ideell for håndtering av Unicode-tegn. På grunn av denne implementeringen, gir NSString klassen out-of-the-box støtte for internasjonalisering.

Jeg vil understreke at strengen administrert av en NSString eksempel er uforanderlig. Dette betyr at når strengen er laget, det kan ikke endres. Utviklere som kommer fra andre språk, som for eksempel PHP, Ruby, eller Javascript, kan bli forvirret av denne atferden.

Stiftelsen rammeverket definerer også en foranderlig underklasse av NSString, NSMutableString, som kan endres etter at det er blitt opprettet.

Det finnes ulike måter å lage streng stedene. Den enkleste måten å opprette en streng objekt er ved å ringe strengen metoden på NSString klassen, som returnerer en tom streng objekt. Ta en titt på klassen referanse NSString for en fullstendig liste over initializers.

En annen felles vei for å skape streng gjenstander er gjennom strenger som vist i eksempelet nedenfor. I dette eksempel er en streng er tilordnet someString variabel. Ved kompilering, vil kompilatoren erstatte strengliteral med en forekomst av NSString
NSString * streng1 = @. "Dette er en streng bokstavelig.";

NSString klasse har et mangfold av instans og klassen metoder for å skape og manipulere strenger, og du vil sjelden eller aldri føler behov for å underklasse NSString.

La oss utforske NSString og sin foranderlig underklasse, NSMutableString, ved å legge følgende kodebit å main.m.
NSString * string1 = @ "Dette er en streng bokstavelig."; NSString * string2 = [[NSString alloc] initWithFormat: @ "Strings kan lages på mange måter."]; NSMutableString * mutableString = [[NSMutableString alloc] initWithString: string1] [mutableString appendFormat: @ "% @", string2]; NSLog (@ "% @", mutableString);

Vi starter med å lage en streng objekt med en streng bokstavelig. I den andre linjen, skaper vi en ny streng ved hjelp av én av de spesialiserte initializers som NSString gir. En foranderlig strengen blir opprettet ved å passere den første strengen som et argument. For å illustrere at foranderlig strenger kan endres etter skapelsen, er string2 vedlegg til foranderlig streng og logget til konsollen vinduet.



NSArray og NSSet

NSArray klassen forvalter en uforanderlig, sortert liste over objekter. Stiftelsen rammeverket definerer også en foranderlig underklasse av NSArray, NSMutableArray. Den NSArray klassen oppfører seg veldig mye som en C array med den forskjell at en forekomst av NSArray forvalter stedene. I tillegg NSArray erklærer et bredt spekter av metoder som letter arbeidet med matriser, for eksempel metoder for å finne og sortere objekter i matrisen.

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

Legg inn følgende kode til main.m å utforske NSArray og dens foranderlig motstykke, NSMutableArray
NSArray * myArray = [NSArray arrayWithObjects: @ "Brød", @ "Butter", @ "Milk", @ "Eggs", nil]; NSLog (@ "Number of Elements >% li", [. ,,,0],myArray telle]); NSLog (@ "Object på Index 2 >% @", [myArray objectAtIndex: 2]); NSMutableArray * myMutableArray = [NSMutableArray arrayWithObject: [NSNumber numberWithInt: 265]] [myMutableArray addObject: [NSNumber numberWithInt : 45]]; NSLog (@ "Form Array >% @", myMutableArray);

I den første linjen, skaper vi en matrise ved hjelp av arrayWithObjects: klassemetode. Denne metoden tar et variabelt antall argumenter objekter-med det siste argumentet er null-som ikke er inkludert i tabellen. I andre og tredje linje, spørre vi matrisen for antall objekter i rekken og objektet lagres på indeks 2 hhv.

Fordi NSMutableArray arver fra NSArray, oppfører det seg mye på samme måte som NSArray. Den viktigste forskjellen er at gjenstander kan legges til og fjernes fra tabellen etter at det er blitt opprettet.

Før du går videre, vil jeg si noen ord om NSSet. Denne klassen er lik NSArray, men de viktigste forskjellene er at innsamling av gjenstander som et sett forvalter er uordnet og duplikater er ikke tillatt.

Fordelen med NSSet er at søkene sine gjenstander er raskere hvis du bare trenger å vite om et objekt finnes i settet. Stiftelsen rammeverket definerer også NSOrderedSet. Forekomster av denne klassen har fordelene av NSSet, men også holde styr på posisjonen til hvert objekt.



NSDictionary

Som arrays, ordbøker er et vanlig begrep i de fleste programmeringsspråk. I Ruby, for eksempel, er de omtalt som hashes. Det grunnleggende konseptet er enkelt, en ordbok forvalter en statisk samling av nøkkelverdipar eller oppføringer.

Som i Ruby hashes, ikke nøkkelen til en oppføring ikke trenger å være en streng objekt per se. Det kan være alle typer objekter som samsvarer med NSCopying protokollen så lenge nøkkelen er unik i ordlisten. I de fleste tilfeller, men det er anbefalt å bruke string gjenstander som nøkler.

Som arrays, ordbøker kan ikke lagre en nullverdi. Hvis du ønsker å representere en nullverdi, så kan du bruke NSNull. Den NSNull klassen definerer a enkelt objekt som brukes til å symbolisere nullverdier i matriser, ordbøker, og sett.

The Singleton mønsteret er et viktig mønster i mange programmeringsspråk. Det begrenser oppretting av en klasse til en gjenstand. Du vil omhandle singleton gjenstander ofte når utvikle iOS applikasjoner.

Som NSArray definerer Foundation rammeverket en foranderlig underklasse av NSDictionary, NSMutableDictionary. Det finnes ulike måter på å bruke en ordbok. . Ta en titt på følgende kodebiten
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ørste to separate streng objekter som inneholder samme streng. I tredje linje, instantiate vi en ordbok ved å ringe dictionaryWithObject: Forkey. Metoden på NSDictionary klassen

Deretter spør vi ordlisten for objektet forbundet med innholdet i KEYB og logge dem til konsollen.

Det er viktig å ta hensyn til detaljene. Selv om vi brukte Keya som nøkkelen til nøkkelverdi-par og KEYB som nøkkelen for å hente verdien eller gjenstand for nøkkelverdi-par, ordlisten ga oss riktig objekt. Den NSDictionary klassen er smart nok til å vite at vi vil at objektet forbundet med streng MyKey. Hva betyr dette? Selv om objektene Keya og KEYB er forskjellige objekter, er strengen at de inneholder det samme, og det er nettopp hva den NSDictionary klassen bruker å referere til objektet.

Følgende kode fragment viser at en ordbok kan inneholde en annen . ordbok-eller matrise-og det viser også hvordan man kan arbeide med foranderlig ordbøker
NSMutableDictionary * myMutableDictionary = [NSMutableDictionary ordboken] [myMutableDictionary setObject: myDictionary Forkey: @ "myDictionary"]; NSLog (@ "% @", myMutableDictionary );



Objective-C Literaler

Tidligere i denne artikkelen, introduserte jeg deg til Objective-C strenger, for eksempel @ "Dette er en streng bokstavelig.". De tar form av en C strengliteral prefiks med en @ -tegnet. Som du sikkert vet nå, indikerer @ tegn på at vi går inn i Objective-C territorium.

En Objective-C bokstavelig er ikke noe mer enn en blokk med kode som viser til et Objective-C objekt. Med utgivelsen av Xcode 4.5, kan du nå også bruke Objective-C konstanter for NSNumber, NSArray, og NSDictionary. Ta en titt på følgende kodebiten for å se hvordan dette fungerer
NSNumber * oldNumber1 = [NSNumber numberWithBool: YES];. NSNumber * newNubmer1 =YES; NSNumber * oldNumber2 = [NSNumber numberWithInt: 2147]; NSNumber * newNubmer2 = @ 2 147; NSArray * oldArray = [NSArray arrayWithObjects: @ "ett", @ "to", @ "tre", nil]; NSArray * newArray = @ [@ "en", @ "to", @ "tre"]; NSDictionary * oldDictionary = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: 12345] Forkey: @ "nøkkel"]; NSDictionary * newDictionary = @ {@ "nøkkel": @ 12345};

Ikke bare er Objective-C litteraler kjølig og sexy, de også gjøre koden mer lesbar. Mark Hammonds skrev en tutorial om Objective-C litteraler. Les Markus innlegg for en mer fullstendig oversikt over Objective-C litteraler.



Logging med NSLog

I denne artikkelen har vi gjentatte ganger brukt NSLog funksjon, som er definert av stiftelsen rammeverk. NSLog godtar et variabelt antall argumenter med det første argumentet være en streng bokstavelig. Den strengliteral kan inneholde formatbransjen som erstattes av de ekstra argumenter som sendes til NSLog funksjon
NSLog (@ "% @ -% i -% f", @ "et objekt", tre, 3,14);.

Besøk Mac Developer Library for en fullstendig liste over de formatbransjen som kan brukes.



Konklusjon

Selv om vi har dekket mye bakken i denne artikkelen vil vi har så vidt skrapet i overflaten av hva stiftelsen rammeverket har å tilby.

Det er ikke nødvendig å kjenne detaljene i hver klasse eller funksjon definert i stiftelsen rammeverk for å komme i gang med iOS utvikling, though. Du vil lære mer om stiftelsen rammeverk som du utforsker iOS SDK.

I neste artikkel vil vi utforske UIKit rammeverk og jeg vil også diskutere ins og outs av en iOS-applikasjon.



Previous:
Next Page: