Iphone için programlamayı öğrenirken deneyimlerimi bu blogda paylaşacağım.

Tuesday, 13 October 2009

Bir iphone uygulaması başlarken neler oluyor?

İlk yazı olarak IPhone uygulamasının başlangıç aşamasında hangi adımlardan geçiliyor konusunda bugün okuduklarımı özetleyeyim istiyorum.


Kullanıcı iphone ' da uygulamalarından birini seçip çalıştırdığında uygulamanın main metodu çağrılır. Bu projede main.m dosyası içinde bulunan ve aşağıdaki kod parçasından oluşan kısımdır.


int main(int argc, char *argv[]) {
  
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}


Bu kod parçasında yapılan 2 önemli iş var. Biri bellek yönetimi için AutoReleasePool ' un oluşturulması. Diğeri de uygulamayı başlatacak olan UIApplicationMain metod çağrısının yapılması. 


UIApplicationMain ' in 4 parametresi var. Argc ve Argv yi anlamak kolay. Argc uygulama başlatılırken kullanılan parametre sayısı, argv is char* array olarak bu parametreler.  


Diğer 2 parametre ne ile ilgili? 3. parametre UIApplication sınıfının ismini alıyor. Bu örnekte nil olduğu için UIApplication kullanılacaktır. Fakat uygulamanıza özel UIApplication ' ın alt sınıfını oluşturduysanız ismi burada verilmeli. 4. parametrede benzer biçimde Application Delegate ' in ismi. 


UIApplicationMain çağrısından sonra parametrelere göre UIApplication ve UIApplicationDelegate implementasyonları seçiliyor. UIApplication ' a delegate olarak seçilen UIApplicationDelegate objesi veriliyor. Bu sayede uygulama aktif hale geldi, uygulama kapanacak gibi haberler alındığında işlemler yapacaksak bunları delegate class'ının içine yazıyoruz.  Aşağıda bu haberler UIApplication tarafından yollandığında ne yapılacağı delegate da yer alacak aşağıdaki metodlarda yazılıyor. 

- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"Application is active");
}
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSLog(@"Application has finished launching");
    [window makeKeyAndVisible];
}


- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"Application will terminate");
}


Akışın diagramı




Bundan sonra info.plist okunuyor ve Main Nib dosyası olarak bir giriş varsa bu Nib dosyası okunuyor ve nib ten görsel bileşenler oluşturuluyor.  Uygulamanın ana penceresi mesela. window makeKeyandVisible çağrısı ile ana pencere ekranda görünür hale geliyor. 


Bundan sonra uygulama kullanıcıdan gelecek input ' ları beklemeye başlıyor. Kullanıcının ekran üstündeki hareketlerinden UIEvent ve UITouch gibi objeler oluşturuluyor ve bu input lar bir Queue yapısına giriyor. 


NSRunLoop bu Queue yapısında tutulan input ' ları izliyor ve bunları sırayla alıp uygulamaya kullanıcı 100,200 lokasyonuna clickledi haberini veriyor.


Uygulamada UIResponder ' in alt nesneleri bu haberleri işleyebiliyor.  UIView ve alt nesneleri UIResponser ' dan extend ediyor. Click bir butonun üstündeyse o an First Responder olarak butona haber gidiyor ve bu event ' e karşılık buton bir işlem gerçekleştirilebiliyor örneğin bir videoyu oynatmaya başlıyor. 


Aynı döngü kullanıcıdan yeni event ' ler geldikçe devam ediyor. Eğer First Responder event ile ilgilenmiyorsa event bir üstteki Responder ' a yollanıyor. Bir üstteki ilgilenmiyorsa o responder'in üstü şeklinde ilerlemeye devam ediyor. Bu tüm kontrolleri içeren View ve Window nesnelerine kadar ilerleyebiliyor.


NSRunloop işlem gerçekleştirildiği sırada uyuma moduna geçiyor. İşlem bitirdiğinde uyanıp Queue'da yeni event ' ler varsa bunların aynı şekilde işlenmesini sağlıyor . 


Ta ki uygulama kapanana kadar...

No comments:

Post a Comment