Objective-C Bogen – Kapitel 2: Grundlæggende Objective-C

Tid til lidt grundlæggende Objective-C

Tid til lidt grundlæggende Objective-C

NOTE: Dette er kapitel 2. Du kan se en lister over alle kapitlerne ved at klikke her.

Sidst kiggede vi en del på Xcode, og vi introducerede også Objective-C. I dette kapitel fortsætter vi med at introducere Objective-C og vil kigge mere på de helt grundlæggende ting som er ret vigtige at forstå helt førend man begiver sig videre med sproget. Jeg vil nu antage at du ved hvordan du opretter et projekt og hvordan du kører det. Det er også vigtig at du lavede alle øvelserne fra sidste kapitel – programmering lærer man kun hvis man rent faktisk udøver det; man lærer det ikke af kun at læse en bog. Hvis du havde svært ved øvelserne forslår jeg at du bruger kommentarfunktionen for at få hjælp.

Indhold

  1. Erklæring og tildeling
  2. Navngivning
  3. Læsevenlige programmer
  4. Operatorerne + go *
  5. Kør, ret, kør, ret og vedligehold: Udviklingsfaserne
  6. Flere erklæringer på samme linje
  7. Nøgleord
  8. Funktioner
  9. Programstruktur

Eklæring og tildeling

Start Xcode, opret et kommandolinjeprogram der hedder Alder (under type vælg Foundation). Lad os starte med at tilrette main. Erstat main med følgende:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        int age;
        age = 4;
        NSLog(@"Jeg er %d år gammel", age);
    }
    return 0;
}

Før main, som vi lige har ændrede, har vi nogle kommentarer:

//
//  main.m
//  Alder
//
//  Created by Jacob Rohde on 05/02/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

Vi kiggede på kommentarer i kapitel 1, så der skulle ikke være noget nyt her. Hvis du ønsker kan du rette i kommentarene så de bedre beskriver programmets formål. Jeg har for eksempel rettet dem til:

//
// Prints my age to the console
// by Jacob Rohde.
//

Af vane skriver jeg altid mine kommentarer på engelsk. Faktisk bruger jeg altid engelske ord i min kode når jeg programmerer, men det behøver du selvfølgelig ikke. Som vi også så i kapitel 1, finders der også flerlinje kommentarer. Så jeg kunne også havde skrevet mine kommentarer som her:

/*
 * Prints my age to the console
 * by Jacob Rohde.
 */

Hvad man vælger er stort set et spørgsmål om smag.

Efter vores kommentarer har vi følgende linje:

#import <Foundation/Foundation.h>

Denne linje genkender vi også fra kapitel 1. Det er et importdirektiv, som sørger for at vi har adgang til alt hvad Foundation kan byde på.

Hvis du er lidt eventyrlysten så hold musen over linjen med import, og hold cmd knappen nede (den har også et ⌘ symbol på tasten). Linjen bliver nu blå med en streg under. Hvis du klikker på linjen navigerer du nu til filen Foundation.h og kan se hvad den indeholder. Som du kan se er Foundation.h blot en lang række importdirektiver der importerer headerfilerne for de filer der udgør Foundation-kodebiblioteket.

Lad os klikke tilbage ved at bruge tilbage-pilen øverst til venstre i editoren:

Øverst til venstre er der pile du kan bruge til at navigere frem og tilbage i din historik.

Øverst til venstre er der pile du kan bruge til at navigere frem og tilbage i din historik.

Ok – nu er vi så tilbage i main.m filen. De næste to linjer af vores kode er:

int main (int argc, const char * argv[])
{

Dem kender vi også. Først har vi funktionen mains funktionshoved som fortæller os at den returnerer en int (altså et heltal), at den hedder main, og tager to argumenter: en int, og en tabel af const char * (hvis alt det med en tabel og const char * virker forvirrende, så tænk ikke over det; vi kommer til det i et senere kapitel) . Tubog-klammen på næste linje angiver begyndelsen på funktionens kodeblok.

Derefter har vi:

@autoreleasepool {

Som nævnt i kapitel 1 er vi her inde på noget med hukommelsesstyring, og det vil vi ikke komme ind på før meget senere. Så glem det indtil da – bare sørg for at du har kopieret det i din egen main. Vi ved dog at Tuborg-klammen angiver starten på en kodeblok.

Nu kommer vi endelig til noget nyt:

int age;

Her definerer vi en variabel. Variablen har vi givet navnet age og er af typen int - dvs. heltal så vi kan bruge variablen til at gemme tal såsom 3 og 7, men ikke kommatal. Vi har adgang til denne variabel via navnet age fra stedet hvor vi erklærer den til slutningen af den omgivende kodeblok. Sådan en linje kalder man også for en variabelerklæring, og den bruger oversætteren til at gøre den påkrævede plads i hukommelesen klar.

int er et nøgleord, hvilket er en række af ord som der er reserveret af C og Objective-C. Vi kan ikke anvende nøgleord til andre formål. Så fx. kunne vi ikke erklære en int variabel der også hedder int, med andre ord er følgende ulovlig syntaks:

int int;

I vores erklæring er age det navn vi har givet vores variabel. Dette kalder man en identifikator. Der er regler for udformningen af identifkatorer, det kommer vi til om lidt.

Men hvad er en variabel? En variabel er blot et stykke hukommelse som vi kan anvende via et navn. I vores variabelerklæring beder vi altså oversætteren om at klargøre et stykke hukommelse til os på en sådan måde at den kan indeholde et heltal, og så vi kan tilgå den via navnet age. En variabel indeholder typisk forskellige værdier i løbet af et programs udførsel, med andre ord kan dets værdi variere – det er derfor de hedder variabler.

Bemærk også at vi som altid afslutter vores udsagn med semikolon.

Lad os kigge på næste linje:

age = 4;

Når vi erklærer en variabel kan vi på ingen måde være sikker på hvad den indeholder. Den kan muligvis indeholde 0 men den kan ligeså godt bare indeholde noget skrald, hvad der nu end var i hukommelsen på det tidspunkt. Når man erklærer en variabel er det næste derfor altid at give den en meningsfuld værdi. Det er det vi gør på denne linje. Det kaldes en tildeling, fordi vi tildeler variablen age en værdi. Vi tildeler her age værdien 4. I C og Objective-C anvendes et lighedstegn til tildeling. Når oversætteren ser denne linje vil den generere et stykke maskinkode som ved udførsel vil putte værdien 4 i den del af hukommelsen som age henviser til. Som du kan se har vi here at gøre med en meget ung programmør.

Efter vores tildeling, har vi et NSLog-kald:

NSLog(@"Jeg er %d år gammel", age);

Som vi så i kapitel 1 er NSLog navnet på en funktion fra Foundation-kodebiblioteket, og i parenteserne har vi angivet vores argumenter til funktionskaldet. Der er dog noget nyt her. I kapitel 1 havde vi kun et argument til NSLog og det var den streng vi ønskede skulle udskrives til konsollen. Nu har vi to argumenter, adskilt med et komma. Første argument er @”Jeg er %d år gammel”, og andet argument er age.

Det første argument kender vi som en Objective-C tekststreng (det ses på @ og gåseøjnene). Når vi har mere end et argument til NSLog kalder man sådanne en tekststreng for en formatstreng, da den fortæller NSLog hvordan den skal formattere outputtet til konsollen (hvis man kun har et enkelt argument til NSLog, som i kapitel 1, bliver strengen bare kopieret til konsollen som output) ved at gøre brug af resten af argumenterne. Sådan en formatstreng kan indeholde format-angivere som alle starter med et %-tegn og de fortæller hvordan de andre argumenter til NSLog skal fortolkes og vises. I vores eksempel har vi brugt %d som fortæller at det andet argument til NSLog er et heltal og skal udskrives som sådan. Eller sagt på en anden måde: % angiver at her skal der står værdien af en variabel, og d fortæller at det skal fortolkes som et heltal (dvs. det er et heltalsargument). Da vi kun har en format-angiver har vi kun et ekstra argument: age. Når vores program kører vil %d derfor blive erstattet med værdien gemt i variablen age.

Resten af vores program er som følger:

    }
    return 0;
}

Disse tre linjer behøver stort set ingen forklaring – dem kender vi. Den første klamme afslutter autorelease-kodeblokken. return 0; returnerer 0 til kalderen af main (som er operativsystemet) for at indikere succes, og den sidste klamme afslutter funktionen main.

Lad os nu køre programmet – du skulle gerne se følgende i konsollen:

Resultattet af vores flotte progam

Resultattet af vores flotte progam

Vi kan også set outputtet i Log navigator. Klik på log navigator i navigationsområdet:

Ved at klikke på den markede tab, vises Log Navigator

I venstre side ser vi en liste over alle de gange vi har bygget og kørt vores program. Klik på det øverste debug-resultat for at se outputtet fra vores sidste kørsel:

Brug af Log Navigator

Brug af Log Navigator

Som du kan se er dette en del mere overskueligt end at bruge debug-området til at se konsollens output.

Variabler og konstanter

I vores program havde vi slet ikke behøvet at bruge en variabel; vi kunne istedet bare havde skrevet tallet 4 direkte i NSLog. Se følgende:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        NSLog(@"Jeg er %d år gammel", 4);
    }
    return 0;
}

Hvorfor skulle vi bruge en variabel i stedet for bare et tal direkte i NSLog? Fordi variabler tilføjer mening og hensigt til din kode. Vores program er godt nok så lille at det er helt klart hvad tallet 4 er (nemlig en alder), men et program skal ikke være meget større førend det bliver svært at tyde betydningen af tal der er strøet ud over koden. Sådanne tal kalder man magiske tal eller talkonstanter. Ved at anvende variabler i stedet for talkonstanter bliver betydningen meget mere klar. Hvis vi et sted i koden ser tallet 8 er det uklart hvad det betyder, men hvis vi i stedet ser variabelnavnet priceInDollars ved vi hvad det betyder.

Funktioner og parametre

I en funktion fungerer en parameter ligesom en variabel, dvs. at vi i main-funktionen kan anvende argc – mains første parameter - som have vi en variabel ved det navn.

Erklæring og tildeling på samme linje

I vores program erklærede vi vores heltalsvariabel på én linje og lavede tildelingen på den næste. Da dette er sådan en almindelig ting, kan man gøre det hele i ét trin. Ret main så den ser sådanne ud:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        int age = 4;
        NSLog(@"Jeg er %d år gammel", age);
    }
    return 0;
}

Som du kan se har vi nu én linje som både er en erklæring og en tildeling. Denne konstruktion er klart at fortrække da den sikrer at vores variabel er i en meningsfuld tilstand, og at vi ikke glemmer at give den en værdi.

For at se hvordan en variabel kan variere i løbet af et program, ret main så den ser sådanne ud:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        int age = 4;
        NSLog(@"Jeg er %d år gammel", age);
 
        age = 36;
        NSLog(@"Nu er jeg er %d år gammel", age);
    }
    return 0;
}

Det eneste nye i vores program er dette:

age = 36;
NSLog(@"Nu er jeg er %d år gammel", age);

Den første linje tildeler værdien 36 til vores age variabel. Det betyder at den gamle værdi – 4 – nu er helt tabt og uigenkaldeligt “død”. Derefter udskriver vi vores nye alder med et kald til NSLog.

Flere format-angivere i én formatstreng

I vores alder-program havde vi kun en format-angiver i vores format-streng. Vi kan dog have så mange vi ønsker.

Opret et nyt Xcode project kaldt Mig (som altid et kommandolinjeprogram af typen Foundation), og erstat main med:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
 
        int age = 35;
        int weightInKilograms = 77;
 
        NSLog(@"Jeg er %d år gammel og vejer hele %d kg", age, weightInKilograms);
    }
    return 0;
}

Som det første i vores  autorelease-blok har vi:

int age = 35;
int weightInKilograms = 77;

Her erklærer vi to variabler samtidig med at vi tildeler dem en værdi. Læg også mærke til de selvforklarende variabelnavne. Det er altid en god idé at give så forklarende navne til variabler som muligt. Til vægten kunne vi sagtens i stedet have valgt navnet w som er meget kortere at skrive, men vores weightInKilograms er helt selvforklarende – det fremgår endda at vægten er i kg. Især i Objective-C gør man meget ud af at bruge selvforklarende navne.

Lad os se på vores NSLog kald, for her bruger vi nu to format-angivere i vores formatstreng:

NSLog(@"Jeg er %d år gammel og vejer hele %d kg", age, weightInKilograms);

Begge vores format-angivere er %d da de to variable vi ønsker udskrevet i vores streng, begge er ints (altså heltal). Da vi nu har to format-angivere, skal vi selvfølgelig give NSLog to argumenter (udover vores formatstreng, i alt er det tre argumenter), og det vi gør med age og weightInKilograms. Rækkefølgen af format-angivere matcher rækkefølgen af argumenterne. Så den første %d erstattes af age, og den anden format-angiver erstattes af weightInKilograms.

Når vi kører programmet ser vi følgende:

Kørsel af vores program

Prøv at bytte rundt på de to sidste argumenter, dvs:

NSLog(@"Jeg er %d år gammel og vejer hele %d kg", weightInKilograms, age);

Kan du gætte hvad outputtet bliver? Prøv at regn det ud uden at udføre programmet først. Husk at når format-angiverne skal erstattes med værdien af et af argumenterne skal rækkefølgen matche mellem format-angiveren og argumentet.

Med andre ord vil konsollen nu vise at jeg er 77 år gammel og vejer 35 kg! Sikke noget.

Hvad sker der hvis der er for får argumenter? Prøv at fjerne det sidste argument til NSLog. Hvis du nu prøver at oversætte og køre programmet, vil Xcode vise dig en masse gule advarselstrekanter, så det er tydeligt noget er galt. Lad os se hvad outpuutet bliver – hos mig ser det sådanne ud:

Resultatet af at have for få argumenter til NSLog

Som du kan se er det rent nonsens. NSLog kan ikke finde en parameter til den anden format-angiver. I stedet udskrives blot noget skrald fra hukommelsen. Så hvis dit konsoloutput ser underlig ud, kan det være på grund af et manglende argument.

Hvad hvis der er for mange argumenter, dvs. flere argumenter end format-angivere? Well, i det tilfælde sker der ikke noget – de overflødige argumenter ignoreres blot.

Argumenter og parametre: Tit bruges ordene argument og parameter i flæng. Men helt korrekt er et argument det udtryk der bruges når funktionen kaldes. En parameter derimod er den variabel der er en del af funktionshovedet.

Navngivning

Jeg har tidligere berørt vigtigheden af at give selvforklarende navne til variabler. Det gælder dog ikke kun variabler men alle identifikatorer, dvs. også funktionsnavne (vi kigger lidt mere på funktioner senere i dette kapitel, og der vil også være et helt kapitel om funktioner). Så navngiv hellere en variabel countOfGoblins end count. Selvforklarende identifikatorer er også selvdokumenterende og altså ligeså vigtige som gode kommentarer.

Spørgsmålet er så, hvad er reglerne for navngivning? Antallet af tegn du kan bruge, skal du ikke tage dig af – de kan være op til 63 tegn hvilket er rigeligt. Derudover er det vigtigt du er klar over begrænsningerne på hvilke tegn du kan anvende. Følgende er lovlige i identifikatorer:

  • bogstaver (store som små)
  • tal
  • en nedre streg, dvs. tegnet _ (men ikke bindestreg: -).

Selvom du kan anvende tal, må et tal ikke være det første tegn i navnet.

Følgende er eksempler på lovlige navne:

  • count
  • lion4
  • myCar
  • vatOfGoods
  • _price
  • price_
  • vat_of_goods

Og her har vi nogle ulovlige navne:

  • 1price
  • $yo
  • my name

Derudover er der forskel på store og små bogstaver. Dvs. myAge og myage og MyAge er tre helt forskellige identifikatorer. Det er vigtigt at du forstår dette!

Navngivningskonventioner

Udover regler vedrørende navngivning, er der også nogle konventioner, som man gør klogt i at følge. De er som følger:

  • Variabel og funktionsnavne starter med lille bogstav, men hvert ord derefter starter med stort. Fx.: myName, shootPhotonTorpedo.
  • Klassenavne starter med stort. Fx. WarShip og NSString (vi kommer til klasser senere i bogen når vi kigger på objekt-orienteret programmering).

Der er også andre navngivningskonventioner der er værd at kende, men dem nævner jeg når vi kommer til dem. Dem nævnt her er de vigtigste.

Læsevenlige programmer

Som tidligere nævnt i kapitel 1, er der som sådan ingen krav til formateringen af koden. Fx. kunne al koden stå på én linje, som illustreret med main her:

int main (int argc, const char * argv[]) {@autoreleasepool{int age=4;NSLog(@"Jeg er %d år gammel", age);age=36;NSLog(@"Nu er jeg er %d år gammel", age);}return 0;}

Det kræver ingen Einstein for at se at dette er virkelig dårlig kode på den måde at det er stort set umuligt at læse og forstå. Men det er helt lovlig kode. Udover visse krav, som fx. at der skal være mellemrum før og efter et nøgleord (som fx. int, char osv.) er vi helt fri til at formatere koden som vi ønsker.

Her er dog ingen grund til at blive kreativ. Du burde følge de konventioner der er i Objective-C og C miljøet. Den kode du ser i denne bog vil også følge konventionerne for god læsevenlig kode. Der er dog ikke én korrekt konvention men flere forskellige, og hvilken man tillæger sig er udelukkende et spørgsmål om smag og behag. Det vigtigste er at du er konsistent i din kode.

Lad mig give nogle eksempler for forskellige måder at formatere sin kode på.

Lad os starte med Tuborg-klammerne. Kig på definitionen af funktionen main:

Min Tuborg klammer for main står på hver sin linje.

Som du kan se står Tuborgklammerne på hver sin linje. Det gør det nemt – synes jeg – at får et overblik over hvor én Tuborg-klammes matchende “bror” findes; hvilket jeg har prøvet at illustrere med den blå streg på billedet ovenfor. For stort set alle kodeblokke anvender jeg denne konvention. En anden måde er dog at placere Tuborg-klammerne som det ses på autorelease-blokken:

På vores autorelease-kodeblok er Tuborg-klammerne placeret på en lidt anden måde.

Her er start-klammen på samme linje som autorelease-nøgleordet, hvorimod slut-klammen får sin egen linje. Denne konvention er også meget udbredt, også for funktioner. Fordelen skulle være at den sparer en linje. Personligt er jeg ikke så vild med den, så jeg benytter den slet ikke (udover for autorelease blokken). Det vigtigste her er ikke hvilken man benytter, men at man er konsistent omkring det.

Et andet punkt hvor der er forskellige konventioner er ved navngivning af identifikatorer såsom variabel- og funktionsnavne. I C (og til dels C++) angiver nogle variabler ved at adskille ord med en nedre streg såsom price_in_dollars. I Objective-C er denne navngivningsform stort set aldrig brugt, i stedet bruger man stort bogstav for hvert ord bortset fra det første, dvs. priceInDollars.

Som jeg har nævnt er det vigtigere at man vælger sin egen konvention og så følger den konsistent mere end hvad man vælger. Når det så er sagt, så er der en stor fordel i at følge de samme konventioner som alle andre Objective-C programmører. Det vil gøre det meget nemmere for andre at læse din kode.

Operatorerne + og *

Op til nu har vi lært hvordan vi kan udskrive tekst og heltal til konsollen. Vi har også lært at erklære en variabel og tildele en værdi til den. Det er dog begrænset hvad vi kan udrette med vores nuværende viden. Så lad os hælde lidt mere på. Derfor vil vi nu introducere to operatorer (i næste kapitel kigger vi meget mere på operatorer).

Hvad er en operator? I et programmeringssprog er en operator en handling. Nogle operatorerne er lige til at forstå da de minder om de matematiske ditto. Lad os kigge på to operatorer du helt sikkert kender rigtig godt:

  • Operatoren for addition, som er et plustegn: +
  • Operatoren for multiplikation, som er en asterisk (stjerne): *

Vi kan bruge disse operatorer til at addere og multiplicere talkonstanter og variable lige så tosset vi vil.

Fx. kan resultatet af en addition gemmes i en vairabel:

int resultOfOperation = 3 + 4;

resultOfOperation har nu værdien 7 (som er resultatet af additionen af tallene 3 og 4). Vi kan så senere i programmet kan vi tildele variablen resultatet af en multiplikation:

resultOfOperation = myMonthlySalary * 12;

her skal det antages at monthlySalary er erklæret tidligere i programmet og tildelt en fornuftig værdi (som jo så er min månedsløn).

En operator har brug for nogle operander for at udføre sin handnling. Additionsoperatoren for eksempel forventer to tal som den skal udføre sin handling på (som jo altså er at lægge dem sammen og give os resultatet tilbage). Så i vores første eksempel ovenfor er 3 og 4 operanderne og + er operatoren, og resultatet af handlingen (additionen) er 7. Det er totalt ligegyldigt hvorfra operanderne kommer: det kan være talkonstanter som i vores første eksempel ovenfor hvor begge operander er talkonstanter, eller det kan være variabler som i andet eksempel hvor den ene operand er en variabel (den anden er en talkonstant), men det kan også være fx. resultatet af et funktionskald (ser vi senere i bogen). Dog kan der være nogle krav til operandernes type. Fx. kan additionsoperatorerne ikke lægge et tal og en tekststreng sammen, men kræver to taloperander (fx. heltal som en int variabel eller heltalskonstant som 3 eller kommatal som 3.14 – mere om kommatal i næste kapitel).

Nu vi snakker om operatorer, er tildelingstegnet (altså =) faktisk også en operator. Den forventer også to operander: en operand på højre side som er et udtryk (som kan være arbitrært langt) og en variabel på venstre side som den skal tildele resultatet af udtrykket. (Vi berører både udtryk og operatorer mere i næste kapitel)

Lad os nu se på et program som viser os en masse +’er og *’er. Opret et Xcode projekt – jeg har kaldt mit Operatorer – (Command Line Tool af typen Foundation), og ret main til:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        int myAge = 35;
        int yourAge = 28;
 
        int totalAge = myAge + yourAge;
        NSLog(@"Den totale samlede alder er %d", totalAge);
        NSLog(@"Den totale samlede alder er %d", myAge + yourAge);
 
        int a = 4 + myAge;
        NSLog(@"Min alder er stadig %d", myAge);
        NSLog(@"Variablen a er deridmo %d", a);
 
        myAge = myAge + 4;
        NSLog(@"Nu er min alder %d", myAge);
 
        myAge += 4;
        NSLog(@"Nu er min alder %d", myAge);
 
        int b = 4;
        int c = 2;
        int d = c * b;
        NSLog(@"%d * %d = %d", b, c, d);
 
        myAge *= 2;
        NSLog(@"Nu er min alder %d", myAge);
 
        NSLog(@"4 + 5 = %d", 4 + 5);
    }
 
    return 0;
}

Lad os nu gå programmet igennem, linje for linje. Først erklærer vi to variabler, myAge og yourAge og tildeler dem en værdi. Derefter erklærer vi en ny variable kaldt totalAge og tildeler dem resultatet af additionen af myAge og yourAge. 

Næste linje er et NSLog-kald som udskriver værdien af totalAge. Næste linje igen er endnu et kald af NSLog som udskriver samme værdi som totalAge, men denne gang ved at springe mellemregningen over og lave regnestykket direkte i funktionskaldet. For så vidt NSLog angår er de to linjer helt identiske, da den modtager værdien 63 (summen af myAge og yourAge) som argument i begge tilfælde.

Derefter oprettet vi en variabel a og tildeler den summaen af myAge og 4. Derefter udskriver vi værdien af myAge for at pointere at myAge ikke er blevet ændret af disse regnstykker. Derefter udskriver vi værdien af variablen a.

Vores næste linje er:

myAge = myAge + 4;

Her ændrer vi faktisk værdien af myAge. Først udregnes summen af myAge og 4, og resultatet af dette tildeles tilbage i myAge. Med NSLog udskriver vi værdien af myAge og vi kan se at den nu har en ny værdi.

Lad os se på næste linje:

myAge += 4;

Denne linje er blot en nemmere måde at skrive myAge = myAge + 4. Denne linje lægger altså 4 til værdien i myAge og gemmer det i myAge. Denne forkortelse bruges rigtig tit, så prøv at huske den udenad. Den virker med rigtig mange operatorer, også * som vi ser om lidt.

De næste linje er som følger:

int b = 4;
int c = 2;
int d = c * b;
NSLog(@"%d * %d = %d", b, c, d);

Her opretter vi to heltalsvariabler, b og c. Herefter opretter vi en tredje heltalsvariabel, d, som tildeles resultatet af at multiplicere b og c. Derefter udrkrives resultatet med NSLog.

Lad os rykker videre til næste linje. Her ganger vi myAge med 2 (og gemmer resultatet tilbage i myAge). Denne multiplikation laver vi på den smarte måde:

myAge *= 2;

Vi kunne i stedet havde benyttet den lidt længere metode:

myAge = myAge * 2;

Den følgende NSLog udskriver vores nu pænt fremskredne alder.

Den sidste linje er en NSLog som udskriver resultatet af 4 + 5, men uden brug af variabler.

Jeg håber at dette program har vist dig en masse om brugen af operatorer. Det du har set her kommer du til at bruge igen og igen og igen. Så sørg for du forstår essensen af det, og med øvelse skal det nok komme.

Kør, ret, kør, ret og vedligehold: Udviklingsfaserne

Hvis du har indtastet programmerne vi har kigget på indtil nu, har du muligivs lavet en fejl på et tidspunkt. Eller måske havde du problemer med nogle af øvelserne i kapitel 1, også med en eller flere fejl til følge. For at få dit program til at oversætte og køre, har du måtte rettet fejlene.

Denne process kommer du som programmør til at gennemleve igen og igen og igen. Det kan skrives op som her:

  1. Skriv eller ret program.
  2. Oversæt program.
  3. Kan program oversættes? Hvis ja gå til trin 4, ellers gå til trin 1.
  4. Kør program.
  5. Virker program efter hensigten? Hvis ja gå til trin 6, ellers gå til trin 1.
  6. Frigiv program til dets brugere.

Fejl i trin 2, skyldes syntaktiske fejl, dvs. du har brudt computersprogets egne syntaksregler; det kan fx. være et manglende semikolon (en typisk begynderfejl). Fejl i trin 4 kaldes for semantiske fejl. Dit program kan oversættes og udføres af computeren, og fungerer så vidt computeren angår helt perfekt, men måske har du lavet en forkert matematisk udregning, eller du har misfortolket en lydbuffer så lyden fra mikrofonen som du prøver at gemme i en fil, er i en forkert frekvens etc.

I løbet af denne process, vil du opdage hvorfor gode kommentarer er vigtige: en programmør læser meget mere kode end hun skriver. Derfor er dårlige kommentarer også ligeså irriterende som ingen kommentar.

Flere erklæringer på samme linje

Lad os kigge lidt mere på variabelerklæringer. Vi har set hvordan vi kan erklære en variabel på en linje:

int hz; // Frequency of the input wave

Og vi har også set at vi kan tildele en værdi til vores variabel – hvilket altid er en god idé:

int hz = 440;

Faktisk kan vi erklære flere variabler på én linje. Det ser sådanne ud:

int a, b, c;

Her erklærer vi tre vairabler af typen int (dvs. heltalt), der hedder a, b og c. Men vi tildeler ingen af dem nogle værdi. Det er det samme som:

int a;
int b;
int c;

Vi kan dog godt tildele en eller flere af dem en værdi:

int a = 5, b, c;

Her tildeler vi a – og kun a – værdien 5. Brugen af denne konstruktion er et spørgsmål om smag. Nogle fraråder dog brugen af den, da ovenstående tildeling kan foranledige nogle til at tro at også b og c bliver tildelt værdien 5.

Lad os se det i et program. Opret et nyt program (jeg kalder det Erklæringer), og ret main til:

int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        int a = 7, b;
        NSLog(@"a har værdien %d", a);
        NSLog(@"b har værdien %d", b);
    }
 
    return 0;
}

Hvis du kører dette program, ser du følgende i konsollen:

Output fra vores program

Som du kan se bliver variablen b ikke tildelt værdien 7.

Nøgleord

Som berørt tidligere, er der en del nøgleord i Objective-C. Et nøgleord er et ord som har en speciel betydning i sproget. Som oftest er det en rigtig dårlig ide at bruge et nøgleord som en identifikator (fx. variabelnavn) i et program, og typisk er det endda syntaktisk ulovligt.

Hvilke nøgleord er der så i Objective-C? I modsætning til de fleste andre sprog, er det ikke så nemt at sige. Objective-C tilføjer nogle specielle ord ovenpå C, såsom fx. @autoreleasepool osv., men der er i Objective-C ingen klar definition om sådan et ord er et nøgleord eller ej. Udover disse Objective-C tilfælde, er  der de nøgleord som sproget har arvet fra C. Hvis vi laver vores egen definition af nøgleord, og inkluderer Objective-C “nøgleord” og nøgleordene fra C, får vi følgende liste:

void, char, short, int, long, float, double, signed, unsigned, id, const, volatile, in, out, inout, bycopy, byref, oneway, self, super, return, @autoreleasepool, @interface, @end, @implementation, @end, @protocol, @class.

En del af disse kan ikke benyttes som identifikatorer i dit program – du vil ikke kunne oversætte det; derimod kan andre anvendes uden problemer. Men hold dig på dydens smalle sti, og lad være med at bruge nogle af dem som identifikatorer. Selv i tilfælde hvor det er muligt, vil det forvirre andre Objective-C programmører som er vant til en anden brug af ordene.

Funktioner

Lad os skue lidt fremad og intrdocuere funktioner. Vi vil senere i bogen have et helt kapitel om funktioner, så frygt ikke hvis alt ikke giver mening nu. Men hvad er en funktion? Du har muligvis en intuitiv idé om det, især hvis du har hørt efter i matematikundervisningen, hvor du sikkert har stødt på funktioner. Den matematiske definition på en funktion er dog faktsik mere komplicerede end man skulle tro, og ikke en vej vi vil begå os ned af. Der er dog visse ligheder hvorfor din intuition højst sandsynligt er på rette spor.

For at forstå hvad en funktion er, så se på den som en sort boks. Du kommer noget ind i den, og den giver dig noget tilbage (eller som programmører siger: den returnerer noget). Vi kunne fx. have en sinus-funktion. Vi giver den et argument som er en vinkel i radianer, og den returnerer os sinus af dette argument.

Funktioner kan tage alt fra nul til flere argumenter (hvis man har funktioner der tager 17 argumenter, er det dog nok tegn på dårligt design). Nogle funktioner returnerer en værdi (fx. i vores sinus-eksempel returnerede funktionen sinus af argumentet, og vi har set i alle vores programmer, at main returner et heltal der signalerer programmets status), men en funktion kan også returnerer ingenting (hvilket man kalder void - som er engelsk for ‘tomt’).

En funktion der ikke returnerer noget? Det lyder måske mærkeligt, men det bruges tit i programmering. Her er vi ikke interesseret i en eller anden værdi som funktionen finder frem til os, men interesseret i en handling den gør for os, hvor den ændrer et eller andet i vores program (det kalder man en sidevirkning, eller på engelsk en side effect). Se bare på NSLog-funktionen. Den returner ingenting (dvs. void); vores interesse i den er udelukkende at den kan skrive til konsollen for os.

Når vi skal definere en funktion, skal vi kode to ting:

  1. Funktionshovedet.
  2. Funktionens kode – omgivet af et par Tuborg-klammer.

Vi har allerede i kapitel 1 kigget på mains funktionshoved, så kig der hvis du ikke kan huske det. Vi kommer ind på det igen i kapitlet om funktioner. Uanset hvad har vi allerede nu den nødvendige viden om hvordan vi kan skrive en funktion. Vi vil derfor lave en funktion der returnerer arealet af et rektangel.

Her er koden for funktionen:

int areaOfRectangle(int width, int length)
{
    return width * length;
}

Vores funktionshoved fortæller os at funktionen hedder areaOfRectangle. Vi kan også se at den returnerer et heltal. Som argument tager den to heltal. Med andre ord vil vores “sorte boks” her modtage to heltal, og give os tilbage et heltal. Selve funktionen udregner arealet ved at multiplicere de to argumenter og returner dem til kalderen.

Lad os prøve at bruge denne funktion. Opret et nyt projekt i Xcode – kald det fx. AreaOfRectangle. Skriv ovenstående funktion ind ovenover main-funktionen – dette er en vigtig detalje! I kapitlet om funktioner kommer vi tilbage til det, men indtil da, skal du altid skrive funktioner ovenover din main-funktion.

I din main kan du tilføje et eller flere NSLog-kald der udkskriver arealet af nogle firkanter. Min fil ser fx. sådanne ud (jeg har her udeladt kommentarene øverst i filen og #import-direktivet):

int areaOfRectangle(int width, int length)
{
    return width * length;
}
 
int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
 
        NSLog(@"Arealet af firkanten der er 7 gange 8 meter er: %d", areaOfRectangle(8, 7));
        int width = 17;
        int length = 45;
        NSLog(@"Arealet af firkanten der er %d gange %d meter er: %d", width, length, areaOfRectangle(width, length));
    }
    return 0;
}

Udover at vi har defineret vores egen funktion, er der ikke meget nyt her. Du studser måske over at vi har kaldet at vores funktion direkte i NSLog, men det er der intet galt i. Når NSLog kaldes bliver vores funktion udført først, og den værdi den returnerer bliver givet til NSLog. Det eneste NSLog kræver er at vi skal give den et heltal her (da vi i vores formatstreng har brugt %d), men hvordan vi gør det er helt op til os: det kan være en talkonstant, en heltalsvariabel, eller et funktionskald der returnerer et heltal. Så længe udtrykket ender med at give et heltal er alt i den fineste orden.

Programstruktur

Til sidst i kapitlet, vil jeg kort berøre programstruktur.

De fleste af de programmer vi har lavet og kommer til at lave i denne bog har en meget lineær struktur: det hele starter i main, og herefter udføres instruktionerne i main en linje ad gangen fra top til bund. Vi vil måske gøre brug af nogle funktioner – enten nogle vi selv har lavet eller nogle der kommer med C og Objective-C implementationen – men programmet er i sin natur ret lineær. Selv når vi begynder at anvende objekter vil strukturen være den samme.

Sådan er de fleste programmer i virkelighedens verden ikke. De programmer du støder på når du bruger din Mac eller din iOS-enhed er hændelsesstyret (ligesom Windows programmer, Android programmer osv. er det). Det vil sige at programmet starter – også i main – og gør sig herefter klar til input fra brugeren. Men herefter sker ting kun på brugerens ønske. Med andre ord venter programmet på at nogle hændelser forekommer. Disse hændelser kan være en finger der tapper på en knap, en mus der klikker på et vindue, eller input fra et tastatur.

I denne bog arbejder vi mest med kommandolinjeprogrammer for at kunne fokusere på de vigtige principper, dog vil vi også kigge lidt på de hændelsesstyret programmer for at give dig en smagsprøve.

Øvelser

1. Find en fejl i følgende kodeuddrag:

int price = 500;
NSLog(@"Prisen er %d", Price);

2. Find en fejl i følgende kodeuddrag:

int a = 5
int b = 6;
NSLog(@"%d + %d = %d", a, b, a+b);

3. I programmet med funktionen areaOfRectangle, prøv da at flytte den ned under main. Hvad sker der? Vi kigger mere på dette, og hvad vi kan gøre for at undgå det. Men indtil da, sørg for altid at have dine funktioner før.

4. Lav en funktion der returner volumen af en terning. Brug funktionen lidt i main, og skrive nogle volumener til konsollen.

5. Lav et program der opretter variablerne hourPerDay, minutesPerHour, og secondsPerMinute og tildeler dem de korrekte værdier (fx. skal hourPerDay tildeles værdien 24). Brug derefter disse variabler til at udregne og udskrive til konsollen antallet af sekunder der er på et døgn.

6. Ret programmet fra #5 ved at tilføje dayPerYear, myAge, og udregn og udskriv herefter antallet af sekunder du har levet (tallet vil ikke være helt præcist da du næppe laver denne øvelse på din fødselsdag, men tæt nok på).

7. Skriv en funktion der kan udskrive dit navn til konsollen. Kald denne funktion fra main.

8. Skrive et program hvor du erklærer to variabler. Tildel dem en værdi. Udskriv derefter til konsollen deres sum og produkt.

9. Skriv et program der udskriver en tabel af tallene 1-10 samt deres kvadrattal og kubiktal. For at rykke til et tabstop brug \t i formatstrengen til NSLog. For at give dig lidt hjælp er her fx. linjen for tallet 4:

4    16    64

Der er flere måder at gøre det på. Du kan fx. oprette en funktion som du kalder ti gange. Men det vil jeg lade være op til dig.

Objective-C Bogen – Kaptiel 1: De første trin

Poter i sandet

De første trin

Programmering i Objective-C er ikke noget nyt. Det skulle man dog tro med al den popularitet dette lidt sjove og skæve sprog nyder for tiden. Forklaringen på det er dog klar, og ligger sikkert i din lomme eller på dit skrivebord: en iOS enhed af en eller anden form (iPod, iPad, iPhone) eller måske en Mac Air. I dag er et godt tidspunkt at have Objective-C kompetencer, og dette kapitel er dine første trin mod det mål.

Indhold

  1. Introduktion.
  2. Hvad er Objective-C?
  3. Hvilke værktøjer skal vi bruge?
  4. En tur rundt i Xcode.
  5. Vores første program

Introduktion

Nå, så du vil lære at programmere i Objective-C? Måske kunne du tænke dig at lave det næste store hit der kommer til at storsælge i App Store så du kan trække dig tilbage til Las Palmas? (Min kæreste har allerede pakket vores og børnenes kufferter – og om lidt indsender jeg Happy Ants til App Store.) Eller måske vil du hellere udvikle det næste store inden for videoredigering på Mac? Uanset hvad, så er du kommet det rigtige sted hen.

Her kan du lære alt det grundlæggende Objective-C der er nødvendigt for at rykke videre og lære at bruge nogle af de kodebiblioteker som Apple stiller til rådighed til iOS eller Mac udvikling.

Objective-C er en forudsætning for at kunne udvikle programmer til både iOS og Mac – så det er bare om at komme i gang.

I dette kapitel vil vi introducere de værktøjer vi skal bruge samt kigge på de første begreber inden for Objective-C udvikling. Og bare rolig – du kommer til at lave de første af mange Objective-C programmer i dette kapitel. Derudover kræves der ingen forudsætninger af dig – andet end en pæn stor motivation og en Mac (nej du kan ikke udvikle på en Windows maskine).

Så hent en kop kaffe – eller min egen yndlings læskedrik: en Coca Cola – og bladre videre til næste side så jeg kan fortælle dig lidt om hvad Objective-C egentlig er for et dyr.

 Hvad er Objecitve-C?

For at gøre det kort: Objective-C er en udvidelse af det eviggyldige programmeringssprog C. Som navnet antyder er det en objekt-orienteret udvidelse til C. Hvis du ikke aner hvad der menes med objekt-orienteret, så frygt ikke. Alt det kommer vi til. Men først lidt historie.

C

Det hele starter med et assemblersprog til en meget gammel computer der havde navnet PDP-7. Vi er nu helt tilbage i 70‘erne. Du har nok hørt om Unix. Det var et meget populært operativsystem til computere – og bruges stadig få steder. Den første version af Unix blev kodet i netop PDP-7 assembler sprog. Assembler-udvikling er dog en noget langhåret affære.

PDP-7

En PDP-7. Og den har ikke engang Retina skærm!

Så de kloge Unix folk udviklede et programmeringssprog kaldet B (det fik sandsynligvis sit navn fordi alt dette fandt sted på Bell Labs). En klog fyr ved navn Dennis forbedrede B en del, og kaldte resultatet for C. Derefter skrev de næste version af Unix i netop C.

C har en del styrker. Det er et lille og nemt sprog at lære. Og så er det hurtigt, hurtigt, hurtigt. Disse egenskaber gør det perfekt til netop at implementere et operativsystem.

Omslaget til The C Programming Language

Forsiden til førsteudgaven af bogen om C. Det regnes for at være en af de mest populære computerbøger.

Dog mangler C en del moderne egenskaber der er at finde i nyere sprog som C#, Java osv.

Og det er sådan set det vigtigste der er at sige om C. Men hvad så med Objective-C? Hvad med Apple og iOS? Well, for at fuldende vores Objective-C historie skal vi forbi et firma der hed NeXT.

NeXT og Objective-C

I 1985 – året efter den første Mac så dagens lys, blev den ene af Apples stiftere Steve Jobs fyret fra Apple (den anden stifter Steve Wozniak forlod selv firmaet, også i 1985).

Jobs’ næste forretningseventyr var firmaet NeXT som udviklede nogle fantastiske computere (til en pris kun få tegnedrenge kunne klare), og et fantastisk operativsystem kaldt NeXTSTEP med nogle udviklingsværktøjer der var mange år forud for sin tid.

NeXT blev aldrig den store success hos Hr. og Fru Jensen, men fik dog en vis popularitet i den finansielle sektor samt i den videnskabelige sektor.

De fremsynede udviklingsværktøjer hos NeXT var baseret på et helt igennem objekt-orienteret fundament – og sproget var netop Objective-C.

Objective-C er en lille og simpel udvidelse til C. Objective-C tilføjer moderne teknikker som objekt-orienteret udvikling og nogle få andre ting til C. Da Objective-C er en udvidelse af C er alle C programmer også Objective-C programmer (men selvklart ikke omvendt).

Nex computer

En NeXT compuer med monokrommonitor.

Men hvordan endte Objective-C hos Apple? Jo ser du – midt i 90‘erne løb Apple ind i en masse problemer og var i 1997 på konkursens rand. Samtidig stod Apple og manglede et moderne operativsystem – deres Mac OS 8 var ved at blive forældet sammenlignet med dets konkurrenter, og Windows nød samtidig en enorm succes.

Løsningen på Apples problemer blev at hente den fortabte søn (eller rettere fortabte far) tilbage. Og med sig tog Steve Jobs NeXTSTEP og herunder de gode udviklingsværktøjer der var baseret på Objective-C.

NeXTSTEP blev i 2001 til OS X 10.0 også kendt som Cheetah, og Mac udviklingen skiftede fra C og Pascal til Objective-C. Da iOS er en mini udgave af OS X er iOS udvikling også baseret på Objective-C (generelt er der rigtig mange ligheder mellem Mac udvikling og iOS udvikling – og nogle af kodebibliotekerne deles platformene i mellem).

Vores værktøjskasse

For at komme i gang skal vi have installeret Xcode på din Mac. Måske har du det allerede? Smut til

Macintosh HD > Developer > Applications

Hvis du her kan se et Xcode ikon er du allerede nede med de fede – du kan da gå i gang med afsnittet “En tur rundt i Xcode”. (Bemærk at denne bog antager det er version 4.2 af Xcode du har)

Applications folderen indeholder de programmer man bruger til Mac og iOS udvikling.

Hvis du ikke har Xcode installeret skal det hentes fra App Store. Fyr op under butikken og skriv “Xcode” i søgefeltet. Klik dig herefter ind på Xcode og find installationsknappen.

Screenshot af App store

Klik på “Install” for at installere XCode på din Mac.

Efter du har klikket på installationsknappen hentes installationsprogrammet ned på din Mac; du kan se ikonet i din dock. Når programmet er hentet helt ned klikker du på ikonet for at starte installationen. Selve installationen er der ingen ben i. Når den er færdig er du køreklar til Objective-C udvikling. Men lad os først kigge lidt på Xcode og dens brugergrænseflade.

En tur rundt i Xcode

Start Xcode nu. Du kan finde det i Finder som forklaret tidligere, eller du kan finde det i Launchpad. Da du kommer til at bruge det tit (forhåbentligt), vil det være en god ide at beholde ikonet i dokken; det kan du gøre på en af følgende tre måder:

  • Træk ikonet fra Finder ned på dokken.
  • Efter Xcode er startet trækker du det længere ind på dokken – det at du har placeret det et specifikt sted på dokken tager OS X som at du ønsker at have det fast der.
  • Kontrol-kllik på ikonet og vælg Options > Keep in dock.

Når Xcode starter for første gang, ser du “Welcome to Xcode”-vinduet.

I velkomstvinduet kan du oprette et nyt projekt, forbinde til et versionsstyringssystem  (puha for et ord), kigge i den medfølgende dokumentation, eller gå til Apple’s udvikler portal på Internettet.

Til højre vises også en liste over de projekter du sidst har arbejdet med. Denne liste vil nok være tom i dit tilfælde.

Xcodes velkomstvindue. Fjern fluebenet i “Show this window...” hvis du ikke vil have det skal vises hver gang du starter Xcode.

Opret nyt projekt

Vi vil nu oprette et projekt så vi derved kan se hvordan Xcode ser ud, og hvordan vi kan navigere rundt i det. For at starte et projekt kan du gøre en af følgende handlinger:

  • Klik på Create a new Xcode project i velkomstvinduet.
  • Klik på File >New > New Project i menuen.
  • Tryk på ⇧⌘N

Uanset hvilken mulighed du vælger vil Xcode nu vise dig et såkaldt “sheet” hvor du kan vælge hvilken slags projekt du ønsker at oprette (et sheet er et grafisk element på OS X som blot er et modalt vindue der hænger fast øverst i et andet vindue).

I dette vindue vælger du hvilken slags projekt du vil oprette.

I venstre side af vinduet er der to hovedkategorier: iOS og Mac OS X. Hver hovedkategori er opdelt i nogle underkategorier. Prøv at klikke lidt rundt og se hvilke projekttyper der er.

Hvis fx. du klikker på Applications under iOS kan du se hvilke projekter der findes til udvikling af programmer til iPhone, iPad og iPod.

For at komme i gang med Xcode skal du nu vælge Mac OS X > Application > Command Line Tool. Hermed vælger du et projekt til at udvikle et kommandolinjeprogram til Mac. Denne projekttype er den vi vil benytte i hovedparten af bogen så husk nu hvordan du opretter sådan et projekt!

Der er syv projekttyper man kan benytte til at oprette et iOS applikationsprojekt.

Der er nok nogle som ikke helt ved hvad et kommandolinjeprogram er. Et kommandolimjeprogram er et program som ikke har nogen grafisk brugergrænseflade. Det betyder at man slipper for at tænke på hvordan man får vist et vindue, lavet en menu osv. Med andre ord er det en ideel måde at lære programmering på, da vi kan fokusere på det det handler om. Senere når du har lært Objective-C kan du begynder at lære grafisk udvikling. Vi vil også i denne bog prøve at lave et par grafiske programmer, men vi vil for det meste lave kommandolinjeprogrammer.

Efter at du har valgt Command Line Tool og klikket på Next knappen, skal du nu indtaste nogle få detaljer om projektet. Det først du skal indtaste er produktnavnet, du kan her skrive hvad du vil. Jeg har valgt Test. Det næste du skal udfylde er Company Identifier. Det er en entydig identifikationsstreng på dig eller dit firma som bl.a. bruges hvis du skal udgive dine skabelser på App Store. Det er kotyme her at anvende ens domænenavn bagfra, dvs. dk.mitDomænenavn. Jeg har her angivet net.zoomjam da det er et domæne jeg har. Hvis du ikke har noget domæne kan bruge noget andet, fx. dit navn.

Nedenunder feltet til dit Company Identifier kan du se en Bundle Identifier som entydig identificerer programmet. Som du kan ser er det bare dit Company Identifier med projektnavnet tilføjet.

Under Type skal du vælge hvilken type kodebibliotek du ønsker at anvende. Vi vil her altid anvende Foundation så vælg det her.

Derefter skal du sikre dig at der er et flueben i Use Automatic Reference Counting. Det er relateret til hukommelsesstyring, og det er noget vi vil berøre senere i bogen.

På billeder herunder kan du se hvordan jeg har udfyldt siden.

I dette sheet skal du opgive nogle detaljer omkring projektet du er ved at oprette.

Klik herefter på Next. Sidste trin i processen er at vælge hvorhenne på dit drev Xcode skal gemme projektet. Vælg en folder som du ønsker at bruge til denne bogs projekter. Xcode opretter selv en folder i den folder du vælger, og giver den det samme navn som projektet.

I dette vindue skal der ikke være et flueben i Create git repository da vi ikke får brug at anvende et versionsstyringssystem.

Klik nu på Create og Xcode går igang med at oprette dit projekt, og  hurtigt derefter præsenteres du nu med det vindue hvori du kommer til at bruge en masse tid.

Vi vil kort beskrive de vigtigste dele af Xcodes brugergrænseflade så du har en fornemmelse for hvad de forskellige ting gør, og hvorhenne du kan finde dem.

Xcode skærmbillede

Xcode i aktion. Dette er vinduet efter oprettelsen af vores Test projekt.

Xcode er groft sagt delt op i fem områder. Øverst har vi værktøjsbaren. I venstre side findes navigationsområdet, og i højre side findes værktøjsområdet. I midten har vi den vigtigste del, nemlig editorområdet. Det femte område – debugområdet – er ikke vist på billedet ovenover.

Værktøjsbaren

Lad os starte med at se på værktøjsbaren. Du kan se den her:

Skærmbillede af Xcode værktøjsbar

Værktøjsbaren i Xcode.

Fra venstre af har vi følgende:

  • Run-knap. Ved at klikke på denne knap kører du programmet – dvs. du udfører det og kan se resultaterne af dine anstrengelser. Ved at klikke på knappen og holde musen ned kan du vælge følgende funktioner i stedet for Run: Test, Analyze, Profile. Run er den vi bruger langt det meste af tiden, men vi kigger også kort på nogle af de andre muligheder.
  • Stop-knap. Når et program kører kan du stoppe det ved at klikke på denne knap. Du kan også afbryde et igangværende build ved at klikke på denne knap. Hvis du ikke ved hvad build er kommer vi ind på det senere i dette kapitel.
  • Scheme-vælger. Her vælger du dit aktive scheme. Et scheme er en samling af informationer om hvad der skal bygges, hvordan det skal bygges osv. Når du opretter et projekt opretter Xcode et scheme med samme navn som projektet. Dette scheme har de mest almindelige indstillinger, såsom fx. at projektet er i debug når du kører det, men at det er i release når du arkiverer/udgiver det. Hvis du ikke aner hvad debug, release osv. er for nogle ord, kommer vi ind på det senere i kapitlet. Du kan se indstillingerne for dit scheme ved at vælge Product > Edit Scheme… i menuen.
  • Breakpoint-knap. Denne knap slår breakpoints til og fra. Et breakpoint er et af dig defineret sted og tid i koden du ønsker at Xcode skal stoppe så du kan inspicere programmets tilstand – dette kaldes også debugging.
  • Status-vindue. Dette iTunes-lignende vindue viser Xcodes status. Her kan du se om dit projekt genererer en fejl eller en advarsel. En fejl gør at du ikke kan bygge dit projekt, og er altså noget du skal tage dig af med det samme. En advarsel derimod betyder at Xcode har fundet noget ved dit projekt som er lidt suspekt, dog kan du godt bygge dit projekt alligevel. Tag dog ikke let på advarsler, de er næsten altid tegn på at noget er galt.
  • Editor-knapper. Disse tre knapper bruges til at ændre editorens tilstand. Den første knap er standardeditoren og den der typisk bruges. Knappen ved siden af – den ligner en butler-uniform – slår assistent-editoren til. Denne editor er super smart! Det er en slags intelligent to-kolonnes editor, hvor Xcode gætter hvilken anden fil du har brug for i dit arbejds-flow. Som eksempel, lad os sige at du i editoren arbejder på en såkaldt header fil (hvis du ikke ved hvad header filer er så bliver det forklaret senere i kapitlet).  Hvis du så klikker på assistent-editor knappen vil Xcode opdele editoren i to kolonner, og i den anden kolonne vise den passende implementationsfil. Den sidste knap er Versionseditoren som du kan bruge til at se en historik over de forskellige versioner din fil har gennemgået (funktionen kræver at du anvender Git eller Subversion til versionsstyring).
  • View-knapper. De næste tre knapper bruges til at vise/gemme de forskellige områder i Xcode. Den første knap bruges til at vise/gemme navigationsområdet, den midterste til at vise/gemme debugområdet, og den sidste knap til at vise/gemme værktøjsområdet.
  • Organizer. Ved at klikker her vises organizeren, som bruges til at tilgå den udførlige Xcode dokumentation. Organizer bruges også til at håndtere de enheder du har tilknytte til Xcode i udviklingsøjemed. Det er også her at du håndterer dit versionsstyringssytem såsom Git eller Subversion hvis du benytter et sådanne. Organizer bruges også til at udgive apps på App Store eller dele dem med andre.

Navigationsområdet

Her navigerer du rundt i projektet. Øverst i området er der nogle tabs (jeg har markeret dem med rødt i billedet nedenfor) hvor du vælger hvordan du ønsker at navigere. Når projektet åbner er Project navigator valgt, hvilket også er den mest brugte. I Project Navigator kan du navigere rundt i de forskellige filer og grupper projektet består af. Man kan oprette grupper for bedre at organisere projektet. Grupperne er vist som små foldere, men det er udelukkende et logisk koncept, og har intet at gøre med foldere på din disk. Næste tab er Symbol navigator hvor du kan navigere i projektet via dets klasser og typer (klasser er de grundlæggende enheder i objekt-orienteret programmering; alt det kommer vi til senere i bogen). Næste tab er Search navigator hvor du kan søge i hele projektet. Hvis vi går videre til næste tab, har vi Issue navigator. Her kan du se de problemer såsom fejl og advarsler som Xcode har fundet ved dit projekt. Derefter har vi Debug navigator som vi kommer til at bruge når vi skal kigge på debugging. Den sidste tab er Log navigator. I denne tab kan man se en log over ens builds (vi kommer ind på builds senere i kapitlet) og de kørsler/debugs man har lavet. Her kan man endvidere se konsollen, som er hvor al input/output foregår når vi arbejder med kommandolinjeprogrammer.

Navigationsområdet med vores Test-projekt åbent.

Hvis du kigger tilbage på billeder af navigationsområdet, kan du se jeg har markeret et området nederst med en rød ramme. I dette område kan man finde nogle funktioner indenfor den tab man nu er på. Hvis man fx. er i Project navigator og klikker på det lille plus opretter man en ny fil; hvis man derimod er i Breakpoint navigator og klikker på plus-knappen tilføjer man et nyt breakpoint til projektet. Der er en del nyttige funktioner her – men vi har ikke plads eller tid til at gå alt igennem, så eksperimentér selv lidt med det. Apples har også en udførlig Xcode 4 User Guide hvor du kan lære meget mere om Xcode.

Værktøjsområdet

Dette områder er inddelt i to sektioner (se billedet). Den øverste sektion kaldes inspector (på dansk kan man måske kalde det inspektør, men jeg beholder det engelske begreb). Det nederste område er et bibliotek af en slags. I inspector kan man ændre egenskaber på det man nu har valgt i editoren. Vi kommer ikke til at bruge den vanvittig meget når vi arbejder med kommandolinjeprogrammer, men når vi kigger på GUI udvikling bliver den helt central. Hvis man fx. ønsker at ændre font-størrelsen på en knap er det i insepctor det gøres, eller hvis størrelsen på en tabel skal justeres er det også her, osv.

Værktøjsområdet: øverst inspektøren og nederst biblioteket.

Den nederste sektion – biblioteket som jeg kalder det – består egentlig af fire forskellige biblioteker, som vælges via de fire tabs. Første tab er Fil-biblioteket hvor man kan tilføje forskellige slags filer til projektet. Næste tab viser os snippet-biblioteket hvor man kan tilføje små kodestykker (såkaldt snippets) til ens fil; man kan fx. tilføje en while-løkke til filen i editoren (vi kigger på løkker i et senere kapitel). Tredje tab viser os objektbiblioteket. Det er her man finder alle de grafiske elementer man bruger når man laver Mac eller iOS apps. Sidste tab viser mediebiblioteket som viser de medieresurser man har inkluderet i sit projekt.

Editorområdet

I editoren foregår det egentlige arbejde. Her skriver du din kode, opbygger din brugergrænseflade osv. Editoren skifter udseende alt efter hvilken fil du har åben.

Prøv fx. at klikke på det blå projektikon i Project navigator som vist her:

Vælg projektet i Project navigator.

Du vil se at editoren nu kan bruges til at se og ændre en masse forskellige indstillinger omkring projektet. Prøv nu at klikke på filen main.m også i Project navigator. Nu er editoren en fuldblods programmeringseditor med hvad der kan forventes.

Debugområdet

For at se debugområdet skal du have en kodefil åben i editoren; klik derfor på main.m i Project navigator, debugområdet skulle gerne dukke op nederst i Xcode.

Debugområdet findes nederst i Xcode når en kodefil er åben i editoren.

Hvis du ikke kan se debugområdet, så tjek om du har valgt den pågældende View-knap i værktøjsbaren.

Den midterste View-knap slår debugområdet til eller fra.

 

I debugområdet vil man under debugging se detaljer om variabler i tabellen til venstre, og loggen og andet output ses til højre. Der er også diverse knapper til brug under debugging.

Efter denne lille tur rundt i Xcode skal vi nu lave vores første program.

Vores første program

Ok – så er det tid til at lave vores første rigtige program. Vores Test-program vi lavede før er jo faktisk også et rigtig program, men vil vi nu oprette et nyt projekt og kigge nærmere koden.

Så opret et nyt projekt. Vælg Mac OS X > Application > Command Line Tool. Giv programmet navnet DuStoreVerden. Udfyld Company Identifier med hvad du nu ønsker at bruge her (enten en URL vendt om eller måske et navn – op til dig). Under Type vælg Foundation, og sørg for at der er flueben i boksen omkring automatic reference counting. Vælg til slut et passende sted at gemme projektet.

Fremover når du skal oprettet et projekt vil jeg ikke være så udførlig. Du burde nu vide hvordan du opretter et kommandolinjeprogram.  Det er kun hvis der er noget nyt i processen at jeg vil bringe det frem.

XCode opretter nu projektet, og den har faktisk allerede lavet en lille smule kode vi kan starte med. Prøv at kør projektet (klik på startknappen i værktøjsbaren eller brug ⌘ – R).

Hvis du kigger i konsollen kan du se følgende:

I loggen kan vi se outputtet fra vores program.

Den kode som Xcode har gjort klar til os udskriver altså strengen

2012-01-25 22:08:06.755 DuStoreVerden[12729:707] Hello, World!

i konsollen (dit datostempel vil selvklart være noget andet). Den første del er et datostempel, derefter følger navnet på programmet, og i kantede paranteser har vi et processid som er et nummer operativsystemet har tildelt vores program. Derefter kommer strengen “Hello, World!”.

Ok – så lang så godt. Lad os nu se på koden. Klik på main.m i Project Navigator. Filen åbner nu på op i editoren, og indeholder følgende kode:

//  main.m
//  DuStoreVerden
//
//  Created by Jacob Rohde on 25/01/12.
//  Copyright (c) 2012 __MyCompanyName__.
//  All rights reserved.
//
 
#import <Foundation/Foundation.h>
 
int main (int argc, const char * argv[])
{
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
    }
 
    return 0;
}

Vil vi nu gå koden igennem linje for linje.

Først har vi nogle kommentarer. Alle linjer der starter med to skråstreger er en kommentar. Alt hvad der er på den linje bliver ignoreret af compileren (vi kommer ind på hvad en compiler er om lidt).

Der er også en anden syntaks du kan anvende når du skal skrive en kommentar:

/*
 * Dette er en kommentar
 */

Alt hvad der er mellem /* og */ er en kommentar. Denne slags  kommentarer kaldes også for fler-linje-kommentarer da de kan løbe over flere linjer.

Kommentarer i et program er vigtige. De bruges til at klargøre koden hensigt. Mens man skriver koden er man ikke tvivl om hvorfor man gør sådan og ikke sådan, men bare en uge senere har man glemt baggrunden for ens genistreg. Så for din egen skyld: kommentér din kode.

I vores program fortæller kommentaren lidt om hvad programmer hedder og hvem der har lavet det osv.

Efter kommentarerne kommer et import-direktiv. Lad os starte med det sidste af ordene direktiv. Et direktiv er en instruktion eller kommando til det der hedder preprocessoren. Preprocesseren kører før compileren som en del af hele byggefasen (build phase siger man på engelsk). Import-direktivet beder preprocessoren om at indsætte inholdet af den fil som den angiver på selvsamme sted. Med andre ord bliver #import <Foundation/Foundation.h> erstattet med indholdet af filen Foundation.h. Når man angiver et filnavn som en del af et import-direktiv anvender man enten < og > eller “ og “ til at omgrænse filnavnet afhængig af hvilken type fil der skal importeres:

  • < og > anvendes ved filer som Xcode kender til. Foundation.h er netop sådanne en fil. Man kan også angive navnet på en folder som Xcode kender til. I vores eksempel beder vi Xcode om at importere filen Foundation.h fra folderen Foundation. Xcode ved lige præcis hvorhenne den skal kigge for at fuldføre dette.
  • “ og “ (altså gåseøjne) anvendes ved fil som du selv har skrevet. Her kan man også angive en folder hvis nødvendigt. Her finder Xcoden stien ud fra din projekts rod. Så hvis vi fx. har en fil der hedder Rumskib.h som vi ønsker at importere skriver  vi #import “Rumskib.h”.

Ok, og hvad er det så en slags fil man importerer? Man importere det der hedder header-filer. Det er derfor de har endelsen h.

Og det giver os en god anledning til at kigge på de to vigtigste filtyper vi kommer til at se.

Headerfil

En headerfil har endelsen h ligesom i Foundation.h. En headerfil bruges til at erklære kode som findes i andre filer sådan så denne kode kan anvendes af andre dele af programmet. Headerfiler er derfor med til at facilitere genbrug.

Headerfiler er nødvendige da Objective-C skal se en erklæring af noget kode før det kan anvendes af anden kode. I Objective-C er kode opdelt i forskellige elementer som funktioner og klasser (alt dette kommer vi ind på senenere, men indtil videre tænk på en funktion som det samme som en matematisk funktion hvis du kan huske dem fra skolen), og hvis man ønsker at anvende en funktion fra fil A i fil B, skal fil A se en erklæring af funktionen før den kan anvendes. Derfor bruger man headerfiler.

Selve koden som en headerfil erklærer findes enten i det der hedder et kodebibliotek som er en binær fil et sted på computeren eller i en implementationsfil.

Implementationsfil

Som beskrevet ovenfor bruges headefiler til at erklære kode, og er altså ikke kodegenererende som sådan. Men hvor skriver man så selve koden? Det gør man i en implementationsfil. I Objective-C har implementationsfilen endelsen m som i Rumskib.m. Så I Rumskib.h vil vi erklære hvad vores rumskib kan såsom skyde med fotonkanoner, og i Rumskib.m implementerer vi så koden så den rent faktisk også kan gøre det.

Nyere sprog såsom Java og C# anvender ikke headerfiler. De er smarte nok til at kunne læse alle kodefilerne og finde ud af hvilke metoder der kan bruges og hvilke der ikke kan. De lidt ældre sprog som C, C++ og altså Objective-C anvender dog headerfiler.

 

Det er vigtigt at bemærke – og det kommer vi ind på meget senere når vi skal snakke objekt-orienteret programmering – at man i headerfiler kun skal erklære den offentlige snitflade af ens kode, dvs. i headerfiler erklærer man fx. metoder som man ønsker at dele med verdenen og som kan bruges af andre (og med andre menes her anden kode). Der kan derimod sagtens være en masse “private” implementationsdetaljer og herunder også metoder, som ikke ønskes delt med anden kode, og disse metoder skal ikke erklæres i heraderfiler. Hvis det virker lidt forvirrende så tænk ikker over det. Det hele giver mening efterhånden.

I vores projekt har vi en enkelt fil der hedder main.m. Og vi ved altså nu at det er en implementationsfil – dvs. den indeholder decideret kode. Derimod har vi ingen headerfiler  - dog importerer vi en.

Headerfilen Foundation.h som vi importerer i vores projekt indeholder alle erklæringerne for det Objective-C kodebibliotek der hedder Foundation. Foundation har alle de helt basale ting som man har brug for som Objective-C programmør. Og vi vil bruge Foundation meget i løbet af bogen.

Ok, det var en masse om import-direktivet, men det er også vigtigt at forstå; men hvis det hele virker lidt forvirrende og underligt, så fortvivl ikke. Efterhånden vil det hele give mening, især når du selv får prøvet kræfter med kodningen (så sørg for at lave øvelserne til slut i kapitlet).

Lad os gå videre til næste linje. Den ser sådanne ud:

int main (int argc, const char * argv[])

Det bliver ikke muligt at forklare alt om denne linje til bunds, da det kræver viden om noget vi først kommer ind på meget senere; så en del af forklaringen må du bare tage for gode varer indtil da.

Denne linje kaldes for et funktionshoved (på engelsk function header), og fortæller os at nu starter definition af en funktion. Et funktionshoved fortæller os alt hvad der er vigtigt at vide om pågældende funktion. Så lad os se hvad den fortæller os.

Linjen starter med int. int er en datatype. En datatype fortæller os noget om hvilken slags værdier vi har at gøre med (vi vil beskæftige os meget med datatyper i de næste to kapitler). int er en forkortelse for integers som betyder heltal på engelsk. Med andre ord: når man i sin kode skal arbejde med heltal (dvs. tal som fx. 1, 5, 23 eller -4 men ikke 3,14) bruger man datatypen int.

Her i funktionshovedet fortæller int os at denne funktion returnerer en int. Det betyder at når funktionen kaldes (dvs. når nogle beder den om at udføre sin kode), vil den altid, uanset hvad, give dem der har kaldt den et heltal tilbage.

Derefter følger funktionens navn. I dette tilfælde hedder funktionen altså main. main er en meget speciel funktion i Objective-C (og C og C++), og er den funktion som operativsystemet kalder når programmet starter. Alle Objective-C programmer skal altså have en main funktion et sted da det hele starter her.

Det næste vi har i vores funktionshoved er en parantes. Når man kalder en funktion kan man give den nogle argumenter med. Disse argumenter angives i paranteser. Derfor er det næste efter funktionsnavnet altid en start-parantes: “(“.

Herefter følger en erklæring af de argumenter funktionen skal kaldes med. De erklæres ved først at angive deres type efterfulgt af deres navn. Hvis funktionen accepterer flere parametre, adskilles de med komma. Vi kan derfor nu se at funktionen main tager et argument der hedder argc af typen int (som vi ved er et heltal). Derefter tager main et argument af typen const char * tabel der hedder argv (denne type er lidt avanceret og noget som vi kommer ind på i et senere kapitel, men kort fortalt er denne type en tabel af tekststremge – en tabel kalder man også for et array efter dets engelske navn).

Hvis man starter et program fra kommandolinjen kan man give det nogle parametre med, og det er faktisk disse parametre disse argumenter oplyser os om. Det første af parametrene – argc – fortæller os antallet af argumenter, hvor det næste – argv – er en tabel indeholdende de faktiske argumenter.

For at opsummere vores funktionshoved, har vi her en funktion der hedder main, som returnerer en int, og tager en int og en tabel af const char * som parametre!

Nu rykker vi til næste linje. Det er en Tuborg-klamme “{“ (på engelsk kalder man dem for curly braces). Tuborg-klammer angiver en blok af kode. I tilfælde med en funktion som her viser klammerne hvor funktionen starter og hvor den slutter. Hvis du kigger på den sidste linje i programmet er det en slut-Tuborg-klamme “}” og det er den angiver at her slutter funktionen.

Et program indeholder mange af sådanne nogle klammer, og de matcher alle op parvis og angiver en blok af kode, fx. en funktion. Typisk anbringer man klammerne på sin egen linje, på den måde er det nemt at se de klammer som passer sammen parvis. Men dette er ikke noget krav.

Der er ingen krav til formatering af koden. Selvfølgelig skal der være mellemrum passende steder. Fx. kunn vi ikke starte vores funktionshoved med intmain – der skal være mellemrum mellem int og main. Men derudover er der meget få krav. Faktisk kunne hele programmet stå på en enkelt linje. Det er indlysende at det ville være en rigtig dårlig idé da det ikke resulterer i særlig læsevenlig kode.

Efter Tuborg startklammen starter den koder der udgør funktionen main. Den første linje af kode i funktionen er altså “@autorelease {“.

Det første vi bemærker er en Tuborg startklamme, så nu ved vi at her starter en kodeblok. Hvis vi kigger længere nede i koden, kan vi se den matchende Tuborg stopklamme lige før linjen med return. Spørgsmåler er så hvad @autorelease betyder. Det vil være for meget at komme ind på det allerede nu, men vi kan løfte sløret for at det har med hukommelsesstyring at gøre. Men det må vente lidt.

Vi vil i stedet gå videre til næste linje, og den kender vi. Det er nemlig en kommentar.

Næste linje er hvor det hele sker i vores program! Linjen starter med NSLog og en parantes. Parantesen fortæller os at NSLog er en funktion. Dette er et funktionskald, det vil sige at vi her kalder NSLog-funktionen. I paranteserne giver vi NSLog de argumenter den har brug for. Vi giver den argumentet @“Hello, World!”.

NSLog er en funktion som vil udskrive dens argument til konsollen. Det var også det vi så da vi kørte programmet. Og vi kan se at vores argument passer med hvad vi så i konsollen.

Når man i Objective-C skal skrive en tekststreng omgiver man den med et snabel-a og gåseøjne. Det er derfor at Hello, World! er omgivet af først et snabel-a og så et par gåseøjne. Ligesom tallet 4 er af typen int, er en tekststreng omgivet af snabel-a og gåseøjne – som i @”Hello, World!” – af typen Objective-C tekststreng. Denne type har faktisk et navn: NSString. Vi begynder nu at dyppe vores tæer i objekt-orienteret programmering, og derfor vil vi ikke sige så meget mere om dette lige nu.

Efter vores kald af NSLog funktionen – som jo slutter med en parantes, er det sidste tegn på linjen et semikolon. Ligsom sætninger i (nogle) skriftsprog skal afsluttes med et punktum, skal sætninger (eller udsagn er det nærmere), afsluttes med et semikolon i Objective-C (som i mange andre sprog: C, C++, Java, C#, og andre).

På næste linje har vi en Tuborg slutklamme, det er den der matcher med @autorelease {.

Vores næstsidst linjer er return 0;. Vi så ovenover at main returnerer en int til den der nu kalder funktionen (i tilfældet main er det operativsystemet). Man returnerer en værdi fra en funktion ved at bruge return. Så her returnerer vi altså 0 til operativsystemet. At returnerer 0 fra main betyder at alt er ok, og at programmet slutter fint og uden problemer.

Det sidste i vores program er slutklammen af vores main funktion.

Puha – det var en ordentlig mundfuld. Men nu fik vi også lært ret så meget. Vi kommer meget mere tilbage til ting som funktioner, typer osv. Men du skulle nu have en lille idé om noget af det – dog vil det være naturlig hvis du er lidt forvirrede, for vi har virkelig berørt mange forskellige ting.

Til slut her i kapitlet skal vi kigge lidt på hvad der sker når vi kører vores program. Hvordan bliver vores kode omdannet til et program vi kan udføre? Det funder vi ud af nu.

At bygge et program

Da du kørte vores DuStoreVerden program klikkede du Run-knappen. Hvis du holder musen over denne knap kan du se en lille hjælpetekst der beskriver hvad den gør – og her står: “Build and run the current scheme”. Det leder os til at spørge: Hvad betyder “build”?

 Helt basalt handler det om at Xcode skal tage vores kildekode – dvs. vores .m, .h og .xib filer – og bygge et eksekverbart program ud fra disse komponenter. En computer forstår dens helt eget sprog kaldt maskinsprog, og ikke sprog som Objective-C. Vi skal altså oversætte vores Objective-C program til maskinkode. Til dette formål benytter Xcode en oversætter (på engelsk en compiler). En oversætter tager som input kode i et programmeringssprog (i vores tilfælde Objective-C) og giver som output maskinkode.

Denne process består af flere faser. Klik på projektet i Project Navigator:

Klik på projektet i Project Navigator for at se de forskellige projektindstillinger.

Herefter kan du i editoren se indstillinger for projektet og dets targets. Klik på DuStoreVerden-target (det er nok allerede valgt), og du kan se et faneblad der hedder Build Phases. Klikke på dette faneblad for at se de forskellige faser i byggeprocessen.

Klik på fanebladet Build Phases for at se de faser der er i byggeprocessen.

Som du kan se hedder en af faserne netop Compile Sources som er vores oversættelsestrin. Den næstsidst fase link-fasen sørger for at de kodebiblioteker man anvender bliver en del af det endelige program (de bliver linket – eller hægtet – sammen med vores kode). Til sidst bliver filerne kopieret det rigtige sted hen.

Project og Target: I projektindstillingerne kan du rette indstillinger for både projektet og dets targets. Indstillinger for projektet (altså Project) er grundindstillingerne for alle targets. Et target er det produkt som byggefasen ender med at konstruere. Dets indstillinger nedarves fra projektindstillingerne og kan herefter så modificeres.

 

Debug og release: Når et program bygges, kan man bygge det i enten en debug- eller release-konfiguration. Debug-konfigurationen er målrettet mod fejlfinding (altså debugging); det sker ved at det resulterende program indeholder en masse kode der er nødvendig for at kunne bruge debuggeren og for at give brugbare fejlbeskeder til udvikleren. Det resulterer i et program der er større og ikke helt så hurtigt. Release-konfigurationen derimod indeholder ikke disse kodestumper og er tværtimod optimeret for maksimal ydeevne. Som standard kører Xcode programmerne i debug-konfigurationen. Når du derimod bruger Organizer til at arkivere eller udgive dit program sker det i release-konfiguration.

Resumé

Det var et langt kapitel, men for at komme igang er det nødvendigt med en del viden om Xcode og hvordan det er opbygget. Det er også nødvendigt at vide hvordan man opretter et projekt og så har vi også kigget på de første simple linjer kode.

Øvelser

Hvert kapitel slutter med nogle øvelser. Hvis du er seriøs omkring at lære programmering, er det bydende nødvendigt at du laver disse øvelser. Hvis du har problemer, så brug kommentarfunktionen.

  1. Lav et program der udskriver Hej Du Store Verden i stedet for Hello, World!
  2. Lav et program der udskriver dit fornavn på en linje, dit efternavn på linje nummer to, og på en tredje linje både dit fornavn og efternavn.
  3. Lav et program der udskriver din adresse.
  4. Lav et program der udskriver et stort V med tegnet *. Dvs.:
*       *
 *     *
  *   *
   * *
    *
  1. Ved hjælp af Organizer eller Google, undersøg lidt om funktionen printf som kommer med C. Derefter lav et program der bruger printf til at udskrive dit navn, og læg mærke til at printf ikke udskriver datostempel og alt det andet som NSLog skriver. Hint: Du skal bruge en header der hedder stdio.h.
  2. Brug printf til at udskrive dit fornavn på en linje og dit efternavn på næste linje. Kan du får det til at virke?
  3. Prøv at fjerne import-direktivet fra et af dine programmer. Hvad sker der? Er Xcodes fejlmelding til at forstå?
  4. Prøv at fjerne det ene af gåseøjnene ved en tekststreng i en af dine programmer. Læg mærke til hvad Xcode viser dig i statusvinduet og ude i margenen af editoren. Prøv at klikke på ikonet ude i margenen. Hvad sker der? Er det hjælpsomt?

Hello world!

Ja, sådanne starter de fleste med at lære at programmere; altså ved at lave et program der skriver “Hello world!” i et konsolvindue. Og det vil vi også.

Her på denne blog kan du følge med i tilblivelsen af en bog på dansk om Objective-C. Efterhånden som kapitlerne bliver færdige vil de blive lagt ud her. Ved hjælp af kommentarfunktionen kan du så komme med alle de spørgsmål du har lyst til.

Det første indlæg – dvs. kapitel 1 – er snart på vej. I det kapitel vil vi introducere Objective-C samt lave vores første program. Det er et forholdsvis langt kapitel, så der er noget at glæde sig til.

Med et godt og solidt fundament i Objective-C er man klar til at tackle iOS-udvikling eller Mac-udvikling. Så hvis din drøm er at lære at lave iPad, iPhone eller iPod apps – eller at lære at lave Mac programmer – så giver denne bog dig forudsætningerne for at kunne lære at udvikle til disse teknologier.

Håber vi ses!