KVC i Cocoa

Ibland lär man sig saker långsamt och inser inte att man faktiskt insett något. Nu slog det mig att en kort genomgång av Key-Value Coding i Cocoa kanske kan hjälpa andra. Alltså: en rekapitulation av vad KVC är, och varför det är bra.

Ola Bäckström 19 juni 2008

KVC är i korta drag att man kan fråga ett objekt om dess attribut (properties) med hjälp av en nyckel i form av en sträng.

Som exempel tar vi ett objekt myMessage av typen

// code assumes obj-c 2.0
@interface TTMessage  {
	BOOL highPriority;
	NSString *messageText;
}
@property BOOL highPriority;
@property(copy) NSString* messageText;

@end

Klassisk obj-c

Man kan som vanligt fråga

[myMessage highPriority] 

och få svaret YES eller NO. Man kan också sätta värdet med

[myMessage setHighPriority:YES] 

Här används meddelandesändning, en selektor anger vilken metod som ska utföras på myMessage. I princip är selektorn ett heltal som sedan används för att slå upp var själva funktionen ligger i minnet. Det hela går ganska snabbt, bl a cachar objective-C runtimen vanliga selektor-uppslag.

KVC innebär att man kan nå setters&getters med strängar.

I stället för att ange en selector så anger man en sträng "highPriority". KVC-mekaniken tar hand om att slå upp och finna rätt selektor för att sedan anropa settern eller gettern. Det hela bygger på att man följer KVC-namnkonvention för dessa. Ett attribut x ska ha gettern x och settern setX. Som tur är får man automatiskt rätt namngivna getter och setters om man använder Objective-C 2.0 property-direktivet.

Exempel

[myMessage setValue:newText forKey:@"messageText"];

Där newText är en sträng och där nyckelni detta exempel är hårdkodat som en statisk sträng. Det är inte ett krav, utan finessen ligger naturligtvis i att dessa strängar kan tänkas komma från annat håll. Ett exempel är att det kommer från nib-filen som gjorts i ordning i Interface Builder. Ett lite krystat exempel:

[myMessage setValue:newText forKey:[NSString initWithString:@"messageText"]];

En annan anmärkning är att man får ett boxat (instoppat i en NSNumber) svar om propertien är någon av de enkla datatyperna (heltal, flyttal, NSPoint etc):

NSNumber *prio = [myMessage valueForKey:@"highPriority"];

Resultatet ligger i prio ovan, men inte som en ren BOOL. Vill man ha det får man fråga

BOOL p= [prio boolValue]

Nedan är en figur som visar hur man kan sätta respektive hämta värdet av attributet messageText på dew två olika sätten.

Key-path

KVC innehåller också konceptet key-path som helt enkelt är en kedja av nycklar. "currentMessage.highPriority" frågar ett första objekt om det har en metod currentMessage som returnerar ett annat objekt som i sin tur får frågan om highPriority.

En finess som inte är direkt uppenbar är att det finns en massa snabel-a-nycklar som är en slags funktionsanrop, se Set and Array operators
Om en klass presenterar en tabell, kallad measurements av flyttalsvärden så kan man till exempel finna medelvärdet med

double average =[[obj valueForKeyPath:@"@avg.measurements"] doubleValue];

Eventuella nackdelar med KVC?

Som tidigare nämnt boxas alla icke-objekt in i NSNumber så att valueForKey: och setValue:forKey: bara behöver bry sig om returvärde/argument av typen id. Det förfular koden lite.
Men farten då… massa stränghantering måste sänka prestandan? Varje uppslag innebär att en sträng ska parsas, en matchande selektor ska finnas.

Det är sant, men jag hoppas att någon form av cachning av selektorer görs. Det borde gå i alla fall.

Men vad var fördelarna nu då med KVC?

  • strängar i stället för selektorer. Öppnar för nästa punkt:
  • kunna sätta ihop sökvägar genom ens data. Man kan säga att key-path är ett sätt att navigera runt i sin datamängd – att hoppa mellan objekt.

Puh. Det om det!

,

Kommentera [4]

---

Programspråk för barn (och vuxna med barnasinne!)

Om Scratch. Det är koncept för att barn ska lära sig programmera multimediaapplikationer. Finns på svenska -kul!

Ola Bäckström 31 mars 2008

Jag har just funnit det smått fantastiska Scratch. Det är ett enkelt grafiskt språk, ett matchande IDE, och ett distributiuonssätt som verkligen lyfter.

Min 8-åriga pojke har definitivt blivit “biten” av Scratch. Alla borde prova!

Språket är ganska primitivt, men det är ett objektorienterat språk (utan arv och utan klasser). Enda variabeldatatypen är heltal, inte ens strängar finns!
Funktioner eller metoder finns inte i java- eller c++ mening, men däremot kan objekten lyssna till anrop. Objekten kan prata med varandra och detta möjliggör att parallellprocessning à la Erlang.

I/O är också kraftigt begränsat: input är mus, tangenttryckningar. Output är ljud och grafik. En timer finns också. Fördelen med de få alternativen är att språket inte blir så överväldigande, det går det snabbt och lätt att göra program som trots allt kan vara ganska avancerade.

Slutligen är det enkelt att hämta ner andras verk för att titta på eller för att förändra. När man är nöjd med sitt verk kan man dela med sig till alla andra användare. Finurligt, och lockande för barnen. Tyvärr är denna “dela-med-sig” server bara engelskspråkig till skillnad från programspråket och IDE’t som är översatt till svenska.

,

Kommentera

---

Installera git på OS X

Att installera git på OS X visade sig vara lätt. Inte bara det men det verkar som om git är riktigt lättanvänt att använda också.

Ola Bäckström 16 februari 2008

Inspirerad av Linus Torvalds Googletalk så ville jag prova om det gick att få tag på “git” till OS X. Jag hittade inget färdigt paket och tvekade över mängden jobb som skulle behövas för att bygga git från källkod.

OS X (= Unix) och Linux är ganska likt… men jag var rädd för massa problem. Men eftersom Xcode drar in gcc så finns det ju en chans. Spanade runt lite och fann att Steve Dekorte visade att det inte är någon större match att bygga från skratch à la Linux.

Hämta och bygg


curl http://kernel.org/pub/software/scm/git/git-1.5.4.1.tar.gz -O
gunzip git-1.5.4.1.tar.gz 
tar -xvf git-1.5.4.1.tar 
make configure
./configure --prefix=/usr/local
make all
sudo make install

Detta bygger och installerar git under /usr/local. Förvånande smidigt… inga problem alls… behövde inte modda path heller.


git --version

svarade direkt.

Anpassa

Precis som Steve så knackade jag vidare:


git config --global user.name "För Efternamn"
git config --global user.email blabla@domain.etc

detta fixar en fil .gitconfig i hemkatalogen som sedan läses av de olika gitkommandona sedan.

Skapa ett test-repositorium


mkdir aha-git
git init
git add .
git commit

snabbt och smidigt. Jag bryr mig inte för ögonblicket om att sätta upp en server, men måste få in man-filerna, så

Hämta och installera “man”-filer

Recept funnet här


curl -O  http://www.kernel.org/pub/software/scm/git/git-manpages-1.5.2.4.tar.bz2
sudo tar xjv -C /usr/local/share/man -f git-manpages-1.5.2.4.tar.bz2

där vi varierar oss och drar ned den mindre bz2-filen (istället för .gz). Behöver då j-brytaren för att packa upp bzip2. Notera att vi packar upp direkt på plats så vi kan slå

man git

och det fungerar.

Ska nu prova och lära mig git — det verkar inte så svåranvänt — får återkomma i frågan.

,

Kommentera

---

Om Tekniksidan

Första posten på bloggen.

Ola Bäckström 13 februari 2008

Det här är huvudavdelningenpå bloggen. Innehållet kommer att cirklar runt användargränssnitt samt några språk(lisp, obj-c, erlang) och ramverk (cocoa).

,

---

Nyare »