Category Archives: iOS 5

Aloittelijan opas säikeisiin (threads) iOS-alustalla

Välillä iOS-ohjelmoinnissa törmää tilanteisiin, joissa ohjelman täytyy suorittaa paljon asioita ennekuin jokin tieto voidaan näyttää käyttäjälle. Nämä asiat voivat olla esimerkiksi XML-tiedoston parsiminen, viestit palvelimelle tai raskaat laskentarutiinit. Käyttäjän näkökulmasta on tärkeää, ettei käyttöliittymä jäädy missään vaiheessa siitä huolimatta, kuinka paljon ohjelma käsittelee tietoa. Jos ohjelma suorittaa kaiken yhdessä säikeessä voi käyttökokemus jäädä heikoksi. Tämän takia useat ohjelmointikielet Objective-C mukaan lukien tarjoavat mahdollisuuden suorittaa asioita samanaikaisesti säikeissä.

Säikeet eli threadit saattavat alussa kuulostaa monimutkaisilta. Objective-C:ssä threadien käyttö on onneksi hyvin yksinkertaista. Helpoin tapa tehdä ohjelmatasi monisäikeinen on käyttää NSObject luokan mukana tulevaa performSelectorInBackground:withObject: metodia. Se mahdollistaa minkä tahansa metodin suorittamista taustalla ilman, että käyttöliittymä jäätyy metodin suorituksen ajaksi.

Alla on yksinkertaistettu esimerkki luokasta, joka suorittaa taustalla paljon laskentaa.

MinunLaskuri.h

@interface MinunLaskuri : NSObject {
  //Tyhjä
}

-(void)laskeMiljoonaan;

@end

MinunLaskuri.m

@implementation MinunLaskuri

-(id)init {
  if ( (self = [super init]) ) {
    [self performSelectorInBackground: @selector(laskeMiljoonaan) withObject: nil];
  }
  return self;
}

-(void)laskeMiljoonaan {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  for (int i = 0; i < 1000000; i++) {
    NSString *teksti = [NSString stringWithFormat: @"numero on %i", i];
    NSLog(@"Laskurin %@", teksti);
  }

  [pool release];
}

@end

Alla oleva rivi luo uuden taustasäikeen ja suorittaa luokan metodin nimeltä laskeMiljoonaan kyseisessä säikeessä jäädyttämättä käyttöliittymää. Metodille annetaan
tässä tapauksessa parametriksi nil, koska se ei ota vastaan mitään parametreja.
[self performSelectorInBackground: @selector(laskeMiljoonaan) withObject: nil];

Seuraavat tärkeät huomioitavat ovat rivit:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];

Muistinhallinnan kannalta on tärkeää, että jokaisessa ohjelman säikeessä on ainakin yksi NSAutoreleasePool-objekti, joka ottaa vastaan autoreleasetut objektit vapauttaen ne automaattisesti muistista. Kun kirjoittaa metodia, joka suoritetaan taustasäikeessä kannattaa lisätä heti alkuun ja loppuun kyseiset rivit. Tämän jälkeen voi rauhassa koodailla metodin sisälle mitä haluaa. Yläpuolella olevassa esimerkkitapauksessa metodi laskee miljoonaan ja printtaa konsoliin jokaisen numeron.

Lisää tietoa säikeistä löytyy Applen sivuilta

Manuaalinen muistinhallinta “for dummies” iOS-alustalla – Osa 1

Manuaalinen muistinhallinta voi tuntua alussa haastavalta aloittelevalle ohjelmoijalle. Useissa ohjelmointikielissä vastuu muistinhallinnasta on siirretty garbage collectorille, joka hoitaa muistinhallintaa automaattisesti. Apple lisäsi iOS 5.0 version myötä alustalleen ARC:n (Automatic Reference Counting), joka estää tehokkaasti mm. muistivuotoja ja olioiden vapauttamisesta johtuvia kaatumisia. ARC ei tuo Objective-C:lle garbage collectoria vaan se lisää olioille tarvittavat retain ja release kutsut ennen ohjelman kääntämistä. Xcode 4.2 tarjoaa työkalun, jolla olemassa olevia projekteja voi konvertoida ARC-yhteensopiviksi. ARC:n voi myös kytkeä pois päältä tiedostokohtaisesti.

Jos et kuitenkaan pysty tai halua käyttää projektissasi ARC:tä voit noudattaa muutamaa ohjenuoraa, jotka estävät turhia muistivuotoja ja kaatumisia.

Luokkamuuttujat.

Kun luot uuden luokkamuuttujan voit yksinkertaistaa muistinhallinnan tekemällä siitä propertyn ja asettamalle propertylle retain parametrin. Heti tämän jälkeen kannattaa lisätä luokan dealloc metodin sisälle kutsun, jolla vapautetaan muuttuja. Sen jälkeen voit unohtaa muistinhallinnan kyseisen muuttujan osalta.

On vain yksi asia mikä pitää muistaa. Aina kun asetat muuttujaan tietoa käytä self notaatiota ja vain autoreleasettuja olioita. Käyttämällä self notaatiota autoreleasetulle objektille kutsutaan samalla retain metodia, koska propertyyn oli asetettu retain parametri. Kun ottaa tavaksi luoda luokan metodien sisällä vain autoreleasattuja objekteja välttyy monilta ikäviltä muistivuodoilta. Tällöin ohjelmoijan ei täydy koskaan kutsua manuaalisesti olioiden retain ja release metodeja, koska kaikki tarvittava on hoidettu propertyn esittelyssä ja luokan dealloc metodissa.

Alla havainnollistava esimerkki aiheesta.

EsimerkkiYksi.h

@interface EsimerkkiYksi : NSObject {
  NSString *muuttujaYksi;
}

@property (nonatomic,retain) NSString *muuttujaYksi;

-(void)minunMetodi;

EsimerkkiYksi.m

@implementation
@synthesize muuttujaYksi;

-(void)minunMetodi {
  self.muuttujaYksi = [NSString stringWithString: @”Testi teksti”];
}

-(void)dealloc {
  [muuttujaYksi release];
  [super dealloc];
}
@end

Lisää tietoa muistinhallinnasta iOS-alustalla löytyy Applen sivuilta

iOS5-uutuus: UIPagingViewController

iOS5:n mukana tuli uusia mahdollisuuksia muokata valmiiden komponenttien ulkoasua. Lisäksi sovelluskehittäjille tuli tarjolle kokonaan uusia komponentteja. Vaikka nämä komponentit eivät toimi vanhemmilla versioilla, jossakin vaiheessa on perusteltua vaatia käyttäjiltä iOS5-versiota sovelluksen asentamiseksi tai päivittämiseksi. Jo nykyäänkin jotkin sovellukset vaativat toimiakseen iOS5-version – etunenässä Applen omat sovellukset.

Esittelenkin nyt teille uuden komponentin nimeltään UIPagingViewController, joka lisää samanlaisen sivunvaihtoefektin kuin iBooks-applikaatiossa on ollut käytössä alusta asti. Kuvankaappaus lopputuloksesta näkyy kuvassa 1.

Lopputulos

Continue reading iOS5-uutuus: UIPagingViewController

iOS 5: Projektin luonti storyboardeilla

Apple on hiljattain julkaissut odotetun käyttöjärjestelmäpäivityksen, eli iOS 5. Mukana tuli läjä uusia API-rajapintoja ja ominaisuuksia, joista on paljon iloa ohjelmistokehittäjille. Yksi tärkeimmistä lisäyksistä on storyboard-tiedostot, joissa pystyy helposti määrittämään applikaation navigointilogiikan ja transitiot siirtymissä. Storyboardeja kannattaa kuitenkin toistaiseksi käyttää vain iOS5-käyttöjärjestelmille suunnitelluissa ohjelmissa, sillä storyboardit eivät toimi laitteissa joissa on vanhempi käyttöjärjestelmä. iOS 5 -laitteiden määrä kasvaa nopeaa tahtia, mutta menee vielä aikaa että kaikki ohjelmat olisi järkevää suunnitella iOS5:lle. Siitäkin huolimatta, että storyboardien käyttö ei ole vielä ajankohtaista, siihen kannattaa tutustua hyvissä ajoin. Continue reading iOS 5: Projektin luonti storyboardeilla