Obj-C Crash-Course

Diskuter dine og andres prosjekter. Alt fra Widgets til programmer.

Obj-C Crash-Course

Innleggav EinarJ » fre 09.05.2008 3:23

Det er kanskje enkelte som har hatt lyst til å kikke litt nærmere på Cocoa, men har latt være på grunn av Objective-C, derfor tenkte jeg at jeg skulle gi en kjapp innføring i Objective-C og etterhvert Cocoa.

Et par punkter først:
* Jeg antar at de som leser dette har grunnleggende programmeringskunnskaper, vet hva et objekt er, og helst har tatt i C/C++/Java, det blir rett og slett for mye å ta alt helt fra bunnen.

* Jeg vil ikke si at jeg kan Objective-C i den forstand at jeg er noen mester, så det kan fort være noen feil her, rett dem gjerne opp.

* Jeg prøver å skrive en komplett gaid her, men kommer til å gjøre forbedringer og utdypinger først når jeg har tid, så nye oppdateringer kan komme sporadisk. Allikevel, skal dette bli noe særlig bra som gaid, så trenger jeg feedback, still spørsmål, kom med forslag.

Så, til godsakene, Objective-C:

Objective-C er et supersett av C, hvilket betyr at (nesten) all C kode er gyldig Objective-C kode, så de som har tatt i C, kommer til å kjenne seg igjen ofte. Det er faktisk ganske lite som er lagt til i Objective-C, og det er nettopp det vi skal ta for oss her i første omgang.

Først ser vi på en klasse i C++ (valgt ene og alene fordi den skiller ut implementasjonen til en egen fil)
Kode: Merk alt
//Header
class Firkant
{
   private:
      int height;
      int width;
   public:
      Firkant(int x, int y);
      void setHeight(int x);
      void setWidth(int y);
      double Area();
};
Kode: Merk alt
// CPP-fil
Firkant::Firkant(int x, int y)
{
   width=x;
   height=y;
}

void Firkant::setWidth(int x)
{
   width=x;
}

void Firkant::setHeight(int y)
{
   height=y;
}

double Firkant::Area()
{
   return width*height;
}


Så hele greia i Objective-C
Kode: Merk alt
// Firkant.h
@interface Firkant : NSObject {
@private
int width;
int height;
}

-(Firkant*) initWithWidth: (int)x andHeight: (int)y;
-(void) setWidth: (int)x;
-(void) setHeight: (int)y;
-(double) Areal;
@end

Kode: Merk alt
// Firkant.m
#import "Firkant.h"

@implementation Firkant
-(Firkant*) initWithWidth: (int)x andHeight: (int)y;
{
   [super init]; // Kaller superklassens konstruktør
   width = x;
   height = y;
   return self; // Returnerer en peker til dette objektet
}

-(void) setWidth: (int)x
{
   width = x;
}

-(void) setHeight: (int)y
{
   height = y;
}

-(double) Areal
{
   return width*height;
}

@end


Så, hvordan bruker vi denne klassen? Det er her de skumle firkantparentesene kommer inn i bildet, la oss kikke på en main-funksjon som bruker denne klassen:

Kode: Merk alt
#import "Firkant.h"

int main(int argc, char *argv[])
{
   Firkant* square = [[Firkant alloc] initWithWidth:2 andHeight:4];
   printf("%f\n",[square Areal]); // Skriver ut arealet (2*4 = 8)
   [square setWidth:4];
   printf("%f\n",[square Areal]); // (4*4 = 16)
   return 0;
}



Først et kjapt ord om #import, #import er rimelig lik Javas import, og C/C++ sin #include, den er mest lik Javas, siden den kun inkluderer en fil en gang, og dermed unngår behovet for Header-guards. Så, til en C++ variant av main-funksjonen:

Kode: Merk alt
int main(int argc, char *argv[])
{
   Firkant* square = new Firkant(2,4);
   std::cout << square->Areal(); // Printer 8
   square->setWidth(4);
   std::cout << square->Areal(); // Printer 16
   return 0;
}


Firkantparentesene brukes til det man i C++ bruker -> eller punktum til, nemlig metodekall, i den første linjen, med alloc og init, så skjer det litt av hvert, la oss kikke litt nærmere på den:
Kode: Merk alt
Firkant* square = [[Firkant alloc] initWithWidth:2 andHeight:4];
kan også skrives som:
Firkant* square;
square = [Firkant alloc];
[square initWithWidth:2 andHeight:4];

men kortformen er mer brukt, siden alloc returnerer et Firkant-objekt, og init også returnerer et objekt, så kan man derfor skrive [[Firkant alloc] init], siden den innerste parentesen kjøres først, og returnerer et objekt som den ytre parentesen kan kjøres på, som igjen returnerer objektet den ble utført på, som pekeren vår (square), settes lik.



Vi kunne også ha definert en init-metode uten noen argumenter, som satte standardverdier for height og width, normalt har man alloc til allokering, og init til initialisering av variabler og diverse, og eventuelt initWith dersom man ønsker å ta argumenter. Man har også metoden new, som bare er en kortform av alloc init:
Kode: Merk alt
Firkant* square = [[Firkant alloc] init];
er det samme som
Firkant* square = [Firkant new];


Så helt til slutt, vi har to typer metoder, her har vi definert objektmetoder,. -(void) setWidth: (int)x, vi kan helt fint definere statiske metoder ved å skrive +(void) doStuff. forskjellen er hva som må stå lengst til venstre inni firkantparentesen, en instans, eller navnet på klassen. Legg også merke til at argumentlisten til Objective-C er litt forskjellig fra C-funksjoner: initWithWidth: (int)x andHeight: (int)y; separert med : og navngivning foran alle argumenter, dog kan disse være hva som helst, initWithWidth: (intX) andBallon: (int)y; er like gyldig. Bare husk at "ledenavnene" til parametrene (det foran kolon) er en del av navnet på metoden, slik at ballong-metoden og høyde-metoden i dette avsnittet er to forskjellige funksjoner.

Så, spørsmål?, kommentarer?, generelt forvirret? Hva vil dere vite mer om?

Moderator
Brukerens avatar
medlem i 235 måneder
 

Re: Obj-C Crash-Course

Innleggav oskbee » fre 30.05.2008 3:22

En veldig fin innlednig til obj-c vil jeg si. Lettfattelig men omfattende nok til å komme i gang, om en har vært borti c, c++, java eller lignende.

Det jeg mener kunne vært greit å hatt med er, Access priveleger, datatyper (spes. id), og kansje også litt om exceptions. Da kunne "kurset" bli mer egnet som et enkelt oppslagsverk mens man lærer obj-c / cocoa.. :-)
medlem i 207 måneder
 

Re: Obj-C Crash-Course

Innleggav jp_tix » lør 31.05.2008 23:39

Fin guide. Men vil ikke et supersett av C bety at all C-kode er gyldig ObjC-kode? Skjønner at man kanskje bør være forsiktig med å bruke ObjC-keywords som variabelnavn osv, men er det mer enn det?

Brukerens avatar
medlem i 229 måneder
 

Re: Obj-C Crash-Course

Innleggav EinarJ » søn 01.06.2008 2:19

All C-kode er gyldig Objective-C kode, med unntak av de få ekstra keywordene som er introdusert. I motsetning til C++, hvor ikke all C kode er gyldig C++ kode.

keywordene som blir introdusert er få, men inkluderer "id", noe som man trenger å passe på, siden "id" ikke akkurat er et lite brukt variabelnavn.

Moderator
Brukerens avatar
medlem i 235 måneder
 


Returner til Utvikling på Mac



Hvem er i Forumene

Registrerte brukere: Google [Bot]



cron