Mobil Programlama

iOS

Xcode 5 Instruments

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Xcode ile birlikte sunulan araçlardan biri olan Xcode Instruments, uygulamanızın telefon üzerinde çalışmasını takip ederek oluşabilecek olası sorunları size gösteren ve önlem almanıza yardımcı olan bir analiz arayüzüdür. Uygulamanızın karşılaşabileceği olası bellek hataları, uygulamanın bellek tüketimi, cihaz üzerindeki enerji tüketimi gibi bilgileri size detaylı bir şekilde sunan Instruments, her uygulama AppStore gönderilmeden önce mutlaka incelenmesi gereken önemli bir araçtır.

Şimdi Instruments’ı denemek amacıyla basit bir proje gerçekleştirelim. Yeni proje sihirbazında Master / Detail Application’ı seçerek Navigation Controller kullanan ve listede bir satıra bastığımızda detayları yeni bir pencerede gösteren bir uygulama oluşturalım. 

Uygulamayı Instruments kullanarak denemek için Product menüsünden Profile seçeneğini seçmemiz gerekir.

Bu seçeneği seçtiğinizde Instruments devreye girecek ve yeni bir profil oluşturma sihirbazı başlatılacaktır.

Bu sihirbazda mavi ile işaretlenmiş alanda hangi platformda çalışacağınızı seçebilirsiniz. Instruments içinde sunulan araçlar platformlara ve cinslerine göre bu sol bölümde listelenmiştir. iOS bölümü bağlı olan iPhone ya da iPad gibi bir cihaz üzerinde deneme yapmak içindir. iOS Simulator ise gerçek bir cihazınız yoksa kullanabileceğiniz simulatör araçlarından oluşur. OS X ise Mac OS uyumlu uygulamalar geliştirirken kullanabileceğiniz bölümdür. Kırmızı işaretli alan Instruments’ın bize sunduğu araçları gösterir. Sarı alanda ise seçilen aracın kullanım amacı ile ilgili bilgiler yer almaktadır. Şimdi buradaki belli başlı araçları gözden geçirelim;

  • Allocations: Bu araç bellekte (heap memory) tutulan objeleri takip eder. Sınıf bilgilerini ve bellek miktarını gözlemleyebilirsiniz.
  • Leaks: Bellekteki tüm hareketleri ve kaçakları (memory leak) görüntüleyebilirsiniz. Özellikle ARC kullanmıyorsanız bellekten kaldırılmamış (release) ve kaçak yaratan objeleri bu araçla yakalayabilirsiniz.
  • Activity Monitor: Sistemdeki bellek, CPU, disk ve ağ aktivitelerini takip etmek için bu aracı kullanabilirsiniz.
  • Zombies: Zombie objeler Objective C’de bellekten kaldırılmış (release) ancak yine de kullanılmaya çalışılan ve uygulamanın çökmesine sebep verecek objeleri yakalamak için kullanılır. Bu araçla release işlemi görmesine rağmen erişilmeye çalışılan objeleri yakalayabilirsiniz.
  • Automation: Oluşturacağınız kodlar (script) ile ekranlar üzerinde kullanıcı hareketlerini (UI) simüle edebilirsiniz.
  • Core Data: Uygulamada Core Data kullanıyorsanız Core Data’nın bellek ve disk hareketlerini takip edebilirsiniz.
  • Energy Diagnostics: Cihazın enerji kullanımını bu araçla takip edebilirsiniz. Burada kullanıma 0 - 20 arası bir puan verilir. Eğer uygulamanızdan kaynaklı bir artış oluyorsa (örneğin aşırı CPU kullanımı) bunun önüne geçmeniz gerekir.
  • Network: Ağ kullanımı ile ilgili detaylı bilgiye buradan ulaşabilirsiniz. Gönderilen paketleri ve miktarlarını buradan takip ederek uygulamanın aşırı veri tüketimi yapmamasını kontrol edebilirsiniz. Aşırı veri tüketimi pil süresini olumsuz etkileyecektir.

İlk olarak bir bellek kaçağını (memory leak) yakalayalım. Eğer projenizde ARC kullanmıyorsanız farkında olmadan bellekten atılmamış objeler bırakıyor olabilirsiniz. Bu da uygulamanın uzun süre çalışmasında belleği gereksiz yere şişirecek ve uygulamanın bir noktadan sonra yavaşlamasına ve hatta işletim sistemi tarafından kapatılmasına sebep verecektir. iOS 7 ile birlikte ARC standart sunulduğundan öncelikle örnek bir bellek kaçağı yaratmak için projenin ARC özelliğini kapatalım. Bu amaçla Targets altında Build Settings sekmesine gelerek Language - Objective C bölümünde Objective C - Automatic Reference Counting seçeneğini NO yapalım. Böylece artık bellekteki objelerin yönetiminden biz sorumluyuz.

ARC iptal edildiğine göre artık release ve autorelease ile dealloc metodlarını kullanabiliriz. DetailViewController.h dosyasında myArray adında bir NSMutableArray tanımlayalım ve viewDidLoad metodu içinde bu objeyi bellekte aşağıdaki şekilde oluşturulalım;

 

- (void)viewDidLoad
	{
	    [super viewDidLoad];
	    // Do any additional setup after loading the view, typically from a nib.
	    myArray = [NSMutableArray new];    
	    [self configureView];
	}

 

Şimdi ise projeyi Profile seçeneğiyle Instruments kullanarak başlatalım ve ardından Leaks aracını seçelim. Yapacağımız işlem, tabloda yeni bir eleman oluşturup satıra tıklayarak DetailViewController’ı başlatmak olacaktır. Daha sonra Geri düğmesini tıklayarak DetailViewController’ı ekrandan kaldıracağız ancak myArray bellekten silinmediği için (ARC olmadığından) kaçak yaratacaktır.

Listeden birkaç kere DetailViewController’a geçiş yaptığımızda birden fazla kaçakla karşılaşıyoruz. Projede ARC olmadığından, NSMutableArray geri dönüşlerde release metodu çağırılmadan DetailViewController yok ediliyor ve bu da bellek hatalarına sebep veriyor. Yukarıda hatanın hangi sınıf ve metod içerisinde gerçekleştiği bildiriliyor. Hatayı engellemek için DetailViewController içerisinde aşağıdaki dealloc metodunu ekliyoruz.

 

- (void) dealloc {
	    [myArray release];    
	    [super dealloc];
	}

 

Bu değişikliği yaptığımızda myArray DetailViewController yok edilirken bellekten kaldırılıyor ve myArray kaynaklı bellek hatasının önüne geçiliyor.

Şimdi ise örnek bir Zombie obje yakalamayı gösterelim. Aşağıdaki koda göre myArray bellekten kaldırılması rağmen (release) halen içerisine bir obje eklenmeye çalışıyor olsun. DetailViewController’da viewDidLoad metodunu aşağıdaki gibi değiştirelim.

 

- (void)viewDidLoad
	{
	    [super viewDidLoad];
	    // Do any additional setup after loading the view, typically from a nib.
	    myArray = [NSMutableArray new];
	    [myArray release];
	    [myArray addObject:@"Turkcell"];    
	    [self configureView];
	}

 

Zombie aracını çalıştırıp listeden herhangi bir menü elemanını seçtiğimizde viewDidLoad çalışır ve Zombie objelere karşı bir uyarı alırız. Bu sayede bellekten kalkmış (release) objelerin tekrar kullanılmasını kolaylıkla yakalayabiliriz.

Yukarıda gördüğünüz gibi Zombie aracı bize hangi sınıf ve metod içerisinde Zombie obje olduğunu tespit etti. Şimdi tek yapmamız gereken, addObject metodunu kaldırarak uygulamayı normal haline döndürmek olacaktır.

Bu bölümde XCode Instruments içerisinde başlıca kullanacağımız araçları anlatmış olduk. Uygulamanızı AppStore’a göndermeden önce bellek performansı ve bellek hatalarına karşı mutlaka Instruments ile test etmenizi öneririz. Özellik iPhone 4 ve 4S gibi düşük kapasiteli cihazlarda uygulamanızın sorunsuz çalışması için bellek yönetimine ve performansa önem vermeniz gerekir. Uygulamanın enerji tüketimini de kontrol etmeniz ve kullanıcıların pil ömrüne karşı saygı göstermeniz, uygulamanızla ilgili olumsuz fikirleri önleyecektir.