Posts Tagged memory
Objective-C’de Memory Problemlerinin Giderilmesi
Posted by Deniz Seçilir in Genel, iPhone on May 19th, 2009
iPhone’da uygulama geliştirken en sık karşılaştığımız problemlerinden biri memory management ( hafıza yönetimidir ). Geliştirdiğimiz kodda hafıza ile ilgili herhanbi bir kaçak varsa bu bize, hafıza uyarısı, herhangi bir anda beklenmedik şekilde uygulamanın kapatılması şeklinde geri dönecektir. Bu hataların çoğunluğu derleme zamanında yakanlan(a)mayıp, çalışma zamanında (runtime) ortaya çıkarlar.
Bu hataların bir kısmı ( en güzel olanları :) ) ise simulator’de problem yaratmayıp , sadece telefon üzerinde çalışırken ortaya çıkanlarıdır.
Bu yazıda memory yönetimi , alloc , retain , release metodlari ne zaman/nasıl yapılmalı üzerinde değil, yapılan hatalar nasıl bulunup, fark edilebilir onların üzerinde durulacaktır.
Öncelikle, uygulamamız biz debug ederken-çalıştırırken , herhangi bir adımda EXC_BAD_ACCESS hatası alıp ta kapanıyorsa, ya da herhangi bir hata almadan beklenmedik şekilde kapanıyorsa , memory hatasından şüphelenmeliyiz. İlk yapmamız gereken Xcode > Run > Debugger menüsünden uygulamamızın en son hangi işlemi yaparken hata aldığını bulmak olmalı.
Geliştirme ortamımızı (yani Xcode’u ) memory hatalarını anlayıp, bize uyarı verir hale getirmemiz gerekiyor. Bunun için
- NSZombieEnabled
- NSAutoreleaseFreedObjectCheckEnabled
- NSDebugEnabled
- MallocStackLoggingNoCompact
- MallocStackLogging
- MallocScribble
- MallocGuardEdges
- MallocPreScribble
Xcode > Project > Edit Active Executable Environment > Arguments tabından aşağıdaki değerleri environment variable bölümünde kısmında değerleri “YES” olacak şekilde set edin.
Bu değişkenler set edili iken iPhone üzerinde debug (device debug )işlemi yapamazsınız.

Bu değişkenleri set ettiğimiz zaman uygulamamız herhangi bir anda çakıldığı zaman aşağıdaki şekilde bize bir ipucu verecektir.

Uygulamaki bugların bulunması için bir static analyzer kullanabilirsiniz. Objective-C için en uygun aday LLVM/Clang Static Analyzer uygulaması Uygulamayı taz.bz2 formatında indirip açtıktan sonra yapmanız gerekenler kısaca şöyle:
(Uygulamayı /Users/deniz/Downloads/checker-0.206 altına açtığınızı ve projenizin /Users/deniz/Projects/deneme altında olduğunu varsayalım)
Yeni bir terminal penceresi açıp .
- export PATH=$PATH:/Users/deniz/Downloads/checker-0.206/
- export PATH=$PATH:/Users/deniz/Downloads/checker-0.206/bin/
- cd /Users/deniz/Projects/deneme
- xcodebuild clean ( Bu komut yerine Xcode > Build > Clean kullanılabilir )
- scan-build -o problemler -k xcodebuild -configuration Debug
En son olarak scan-build komutunun sonucunda belirtilen dizin için scan-view işlemi yapılır.
- scan-view /Users/deniz/Projects/deneme/problemler/2009-05-18-1
Son komutun çıktısı aşağıdaki gibi bir ekran olacaktır:

Bu ekranda yer alan View Report linkleriyle o anki hatanın neden kaynaklandığına bakılabilir.

Güncel Yorumlar