iPhoneOS : Arkivera egna objekt

12/03/2010

Låt oss anta att vi vill designa en applikation som innehåller ett antal egendefinierade objekt.

Dessa behöver vi spara på något sätt, t.ex. när användaren stänger av applikationen eller om användaren skulle få ett telefonsamtal under tiden som applikationen körs.  Utifall att detta händer vill vi att applikationens variabler ska bevaras, och att även våra egendefinierade objekt ska sparas på samma sätt som andra inställningar sparas.

Att spara användardata är en återkommande punkt i de flesta iPhone-applikationer, och jag brukar använda NSUserDefaults för att på ett enkelt sätt spara och hämta data.

Data sparas på följande sätt


NSInteger intToSave = 23;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

[preferences setInteger:intToSave forKey:@"keyToSavedInt"];

Och hämtas på följande sätt…


NSInteger intToRetrieve;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

intToRetrieve = [preferences integerForKey:@"keyToSavedInt"];

I min mening det absolut smidigaste sättet att hantera användardata på… det vill säga sålänge som man bara sparar Obj-C datatyper. Men om man däremot vill spara en array av egendefinierade typer, ja då blir det lite mindre smidigt.

Extra smidigt blir det om det dessutom är en hierarki av objekt.

Säg att vi har en applikation som ska hålla koll på lastbilar och deras last.

Låt oss använda en NSMutableArray för att hålla koll på alla lastbilar, och sedan definiera en klass för lastbilar, och en klass för last.

En näst intill pinsamt förenklad implementation av klassen Lastbil följer här.

Lastbil.h

#import <Foundation/Foundation.h>
#import "Last.h"

@interface Lastbil : NSObject {
	Last *last;
}

@property(nonatomic,retain) Last *last;

@end

Lastbil.m

#import "Lastbil.h"

@implementation Lastbil
     @synthesize last

-(id)init
{
    if (self = [super init])
    {
     //Init
		}

    return self;
}

- (void)dealloc
{
    [self.last release];
    [super dealloc];
}

@end

Och så lasten…

Last.h

#import <Foundation/Foundation.h>

@interface Last : NSObject {
	NSString *beskrivning;
}

@property(nonatomic,copy) NSString *beskrivning;

@end

Last.m

#import "Last.h"

@implementation Last

@synthesize beskrivning;

- (id)initWithBeskrivning: (NSString*)b
{
	self.beskrivning = b;
	return self;
}

- (void)dealloc
{
    [self.beskrivning release];
    [super dealloc];
}

@end

Ja nåt i den stilen. Blind kod och en knapphändig implementation, precis som det ska va.

Då är själva objekten deklarerade, det som återstår är att.. ja.. använda dem.

NSMutableArray *lastbilar = [[NSMutableArray alloc] init];

Lastbil *lastbil1 = [[Lastbil alloc] init];
Lastbil *lastbil2 = [[Lastbil alloc] init];

lastbil1.last = [[Last alloc] initWithBeskrivning:@"Fisk"];
lastbil2.last = [[Last alloc] initWithBeskrivning:@"Kött"];

[lastbilar addObject:lastbil1];
[lastbilar addObject:lastbil2];

[lastbilar release];

Då har vi en datastruktur som innehåller två lastbilar, den ena med fisk i lasten och den andra med gott, mört kött i lasten.

Om vi nu vill spara denna datastruktur till NSUserDefaults så skulle vi kunna göra det genom att först arkivera den till ett NSData-objekt med NSKeyedArchiver..

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

MEN detta är inte rumba, och kommer inte att fungera då våra egendefinierade objekt (Lastbil, Last) inte implementerar NSCoding protokollet. Alla objekt måste, om de ska kunna arkiveras, implementera metoder för hur de ska arkiveras och hur de ska avarkiveras. Enligt NSCoding måste alltså våra objekt implementera följande metoder.

- (void)encodeWithCoder:(NSCoder *)encoder
- (id)initWithCoder:(NSCoder *)decoder

Så låt oss implementera dessa metoder först i Lastbil.m. Det vi vill göra är att specifiera vilka av objektets egenskaper som ska arkiveras, och under vilka nycklas värdena ska arkiveras, detsamma för avarkivering.

- (void)encodeWithCoder:(NSCoder *)coder;
{
	[coder encodeObject:self.last forKey:@"last"];

}

- (id)initWithCoder:(NSCoder *)coder;
{
     if (self = [super init])
    {
		self.last = [coder decodeObjectForKey:@"last"];

	}
    return self;
}

…och sedan i Last.m

- (void)encodeWithCoder:(NSCoder *)coder;
{
	[coder encodeObject:self.beskrivning forKey:@"beskrivning"];

}

- (id)initWithCoder:(NSCoder *)coder;
{
     if (self = [super init])
    {
		self.beskrivning = [coder decodeObjectForKey:@"beskrivning"];

	}
    return self;
}

That’s pretty much it.

Nu går det bra att arkivera hela objekthierarkin, eftersom alla objekt i hierarkin kan arkiveras (NSCoder).

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

Och ett objekt av typen NSData går givetvis att spara till NSUserDefaults precis som motsvarande enkla datatyper.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

[preferences setObject:lastbilData forKey:@"Lastbilar"];

Och går att läsa tillbaka, med minimal ansträngning.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [preferences objectForKey:@"Lastbilar"];

	if (lastbilData != nil)
	{
		NSArray *gamlaLastbilar = [NSKeyedUnarchiver unarchiveObjectWithData:lastbilData];

			if (gamlaLastbilar != nil)
			{
				//Presentera information
			}
	}

Och så gör man alltså för att arkivera sina egna objekt!

Andra bloggar om: , , ,

1 Comment

iPhoneOS : Framerate independence

8/03/2010

Närsom man animerar ett objekt på egen hand (OpenGL) så måste man vara beredd på att saker och ting kan hända i resten av operativsystemet under tiden som animeringen pågår. Detta leder då till osmakliga hack i de annars så vackra rörelsemönstren.

För att lösa detta gör jag två saker.

1. Sätter upp en ”target” framerate som är referens vid alla beräkningar.
2. Räknar ut skillnaden mellan faktisk framerate och target-framerate och multiplicerar alla rörelser på skärmen med detta värde.

Något i denhär stilen…

- (void)render {

NSDate *startDate = [[NSDate date] retain];

float wantedTime = 0.025; //Target framerate = 40 fps, dvs 1/40

/*
Rendering sker här, vi använder mätvärde från föregående frame för rörelsekompensation
*/

self.speedFactor = [[NSDate date] timeIntervalSinceDate:startDate] / wantedTime;

}

Alla rörelser multipliceras sedan med speedFactor, såsom


obj.Ypos = (sin(obj.direction*(M_PI/180))*BSPEED) * self.speedFactor;

Inga fler hack när iPhoneOS kollar din mail, uppdaterar din plats eller skickar hemliga data till Steve Jobs medan du spelar!

Andra bloggar om: , , , ,

No Comments

SDK Beta 2 ute.

28/03/2008

sdk Beta 2 ute.Apple lanserar nu iPhone SDK Beta 2, som bland annat innehåller en uppgraderad Interface Builder där man kan skapa interface till iPhone precis som man kan till vanliga OS X Program, samt en näve ny exempelkod. Riktigt gött.

Nästan lika gött som att man, trots att Apple förnekar detta, fortvarande kan installera och köra SDK:t på en PPC Mac :)

Mer info på ADC och en liten changelog här(kräver konto på ADC)

Andra bloggar om: , , ,

No Comments

iPhone SDK har anlänt!

6/03/2008

På tiden! för bara några timmar sen släpptes alltså SDK:t. Mer officiell information på iphone.com och inoficiell information på TUAW samt Macrumors

Intressant just nu är:
* Gratis SDK
* 99$ för utvecklingslicens
* Programdistribution via Itunes (Utvecklaren får 70% av priset vid försäljning)

Väldigt mycket rykten och löst snack just nu, men det som verkar säkert iallafall är följande:
* Firmware 2.0 till Juni (Gratis för iPhone, liten kostnad för iTouch)
* Exchange/ActiveSync i 2.0
* SDK släpps idag (dock är sidan överbelastad för tillfället, lite problematiskt att ladda ner)
* Spore för iPhone demonstrerat på SDK eventet (!)
* SDK endast för OS X

Hoppas kunna lägga vantarna på SDK:n under helgen iallafall, så man kan börja knacka lite kod

Det jag personligen är mest överraskad av är stödet för Embedded OpenGL och OpenAL, ska bli kul att försöka sig på att porta lite gamla projekt.

Andra bloggar om: , , ,

No Comments

iPhone & iPod Touch 1.1.4

26/02/2008

Spännande dag! först nya MacBooks, och nu såhär på kvällskvisten även en ny mjukvara till iPhone/iTouch. Inga nya funktioner vad jag kan se såhär direkt, verkar bara va en del buggfixar. Var medveten om att dina installerade program ryker all världens väg om du uppdaterar en jailbreakad enhet!

Men misströsta ej! det verkar som om ZiPhone Jailbreaken för 1.1.3 fungerar även på 1.1.4. Jailbreakar min Touch samtidigt som jag skriver detta och Installer verkar fungera bra. Bara att installera alla program igen.

Läs här för mer info

Andra bloggar om: , , , ,

No Comments

Nya Macbooks!

26/02/2008

Då var det bekräftat, Apple uppgraderar MacBook samt MacBook Pro med snabbare processorer, mer disk, och mer minne. Man blir lagom sugen!

Specifikationer MacBook:

* 2.1/2.4/2.4GHz Intel Core 2 Duo
* 1GB/2GB/2GB Minne
* 120/160/250GB Hårddisk
* Combo drive/DL Superdrive/DL Superdrive

Specifikationer MacBook Pro:

* 2.4/2.5/2.5GHz Intel Core 2 Duo
* 2GB Minne
* 200/250/250GB Hårddisk
* DL SuperDrive
* NVIDIA GeForce 8600M GT 256/512/512MB
* Multi-touch trackpad som den i MacBook Air

Läs mer på apple store

Andra bloggar om: ,

No Comments

Ipod Touch & Leopard = Problem!

17/02/2008

Verkar som om jag var lite väl snabb på att lovorda Leopard. När jag skulle dra över ett par nya skivor till min Touch så märkte jag till min förskräckelse att den inte syntes till i iTunes. Den laddades som vanligt, den fanns med i USB Prober (xcode), men den vägrade helt enkelt dyka upp i iTunes.

Blev nästan lite rädd ett tag ända tills jag hittade en lösning!

Världens bästa lösning:

  • Avinstallera iTunes (going at it windows style)
    dra iTunes från Applications till papperskorgen
  • Avinstallera AppleMobileDevice kernel extension
    Gå till Mappen /System/Library/Extensions , hitta AppleMobileDevice.kext och släng den i papperskorgen
  • Rensa lite
    Gå till Mappen /Library/Receipts, hitta AppleMobileDeviceSupport.pkg och släng den i papperskorgen
  • Töm Papperskorgen
  • Installera iTunes på nytt från www.apple.com/se/itunes/

Bör tilläggas att varken playlists, musik i iTunes biblioteket eller andra inställningar försvinner när man installerar om, så det är bara att vara lugn.

Andra bloggar om: , ,

No Comments

Tiger -> Leopard

15/02/2008

lprd.jpgSå efter en lång lång tids avvaktande fick jag äntligen tummen ur röven och uppgraderade min G4 Powerbook till Leopard. Nej, jag förstår inte heller att jag efter 3 år fortvarande kan använda samma gamla dator till allt från fotoredigering till film och lite till, men den har helt enkelt gjort sitt jobb mer än väl, och det var dags att den fick en liten uppgradering. Som grädde på moset passade jag även på att slänga i 1 Gb extra minne i den nu medan antika minnen fortvarande saluförs, och sen var det bara att köra.

En liten stund senare var jag igång, och vad kan man säga?

Det första som mötte mig efter att jag hade uppgraderat till Leopard var givetvis den upphottade docken, som ju ser flashig ut och allt, men inte riktigt imponerar ända tills man inser att den fungerar som en riktig spegel! Tog ett tag för mig att upptäcka detta eftersom jag normalt inte gillar att släpa fönster över docken, men när en vän tipsade mig om detta var jag tvungen att undersöka själv. Och visst är det vackert! Kanske inte så väldigt funktionellt, men ändå en detalj som helt klart utstrålar klass och detaljkänsla.

Sedan har vi stacks! Det första jag tänkte var ”varför behöver jag en start-meny i mitt osx?”, men det var innan jag märkte att man kunde ändra visningssättet till häftiga pratbubblor och solfjädrar! Riktigt trevlig liten detalj.

Jag är inte helt säker på att detta är nytt i Leopard, men när jag fulade runt med textuppläsning så lät det som att rösten ”andades” mer än vad jag minns att den gjorde innan. Svårt att förklara, men något skumt var det, och jag tror jag gillar det.

Och så givetvis Quick View! Hade ju hört talas om detta innan men jag kunde verkligen inte komma på hur man fick igång det. Höll på att bli galen när jag tittade på demofilmen som tydligt hade en knapp med ett litet ”öga” i findern, men det hade inte jag. Efter lite googlande lyckades jag lista ut att man kan aktivera det genom att bara trycka space med en fil markerad, fan va pinsamt… men sjukt smidigt att kunna förhandsgranska de flesta dokumentformat utan att behöva starta Photoshop t.ex.

Enda nackdelen jag kan tänka på såhär efter uppgraderingen är… hmm. Nä jag kan nog inte komma på nåt på rak hand. Kanske att min gamla powerbook är liiiite slöare på att uppdatera docken när jag flänger runt på skärmen, men inget att tala om.

Uppgradera nu!

Andra bloggar om: , ,

No Comments

Topp 5 iPhone & iPod Touch Applikationer: Tema Nätverk

15/02/2008

Då var det dags för en ny lista med intressanta applikationer för iPhone/iTouch. Denna gång ska jag fokusera lite på nätverks-verktyg, och då främst säkerhetsrelaterade sådana. Som bekant har ju båda enheterna 802.11b/g wlan, och det innebär att det finns möjlighet för en del hyss! Även om det ännu inte är möjligt att sätta wlan-interfacet i monitor mode, så skadar det ändå inte att vara medveten om möjligheterna som framtiden bär med sig.

Alla dessa applikationer kräver som vanligt en jailbreakad iPhone/iTouch, och ytterligare program såsom vt100-term, sysinfo, sshd och så vidare, inget som inte går att googla sig till.

Då ska vi se..

1. Ngrep

Ngrep i fickformat. Otroligt smidigt litet verktyg för nätverksövervakning/felsökning. Bara att dumpa ner all trafik när man är ute och far för att sedan analysera den med t.ex. Wireshark. Läs mer om hur man använder ngrep här.

2. Nmap

Ingen mobil nätverksplattform utan en portscanner. Fungerar precis som ”vanliga” nmap, inga konstigheter här.

3. Stumbler

Ett verktyg för att hitta trådlösa accesspunkter. Väldigt grundläggande funktionalitet än så länge, men det gör sitt jobb väl. Perfekt för att kartlägga räckvidden på grannens trådlösa nät.

4. Metasploit

Det här är nästan lite skrämmande, men ja, det går att installera Metasploit på din iPhone/iTouch :D . Det är dock inte helt lätt, och det kräver att man har bland annat perl installerat. Men i korta drag går det till såhär:
Ladda först ner framework 2.7
Packa upp, ladda upp till iPhone/iTouch i t.ex. /var/root och sätt chmod 755 på alla filer i katalogen. Kör sedan ”msfweb&”, starta Safari och surfa in på ”http://127.0.0.1:55555″ :) . Om Safari kraschar är det bara att starta om det.

4. CoreOS Network Tools

Som en påse gott och blandat. En liten samling av allt man behöver för att förvandla sin iPhone/iTouch till en riktig liten bärbar nätverksmaskin. T.ex. BitchX, wget osv.

Andra bloggar om: , , , , ,

No Comments

iAno, piano för iPhone & iPod Touch

14/02/2008

Haha detta är ju helt underbart. Trodde jag hade sett allt efter Pocket Guitar, men icke.

Skåda det senaste inom mobil musik!:

Ett litet smakprov av vad vi har att vänta när det officiella SDK:t lanseras!
Mer information over here. Kräver som vanligt en Jailbreakad iPhone/iTouch.

Andra bloggar om: , , ,

No Comments