Posts Tagged iPhone

xCode, 4.0 ile 3.1.3 cihazlarını destekleme

Merhabalar,

xCode kullanan bütün developer arkadaşlar yeni sürümün beta versiyonu sayesinde sadece 4.0 işletim sistemine sahip iPhone donanımlarına uygulama derleyebildiklerini farketmişlerdir. Burada yeni xCode ile yani xCode 4.0 + 3.2.3 ile nasıl eski sürüm iPhone cihazları üzerinde çalışabilecek kod derleyebileceğinizi göstermek istedim.

Aslında süreç çok basit ancak birkaç resim ile pekiştirmekte fayda var. Ekteki resimlerde sırası ile 3.0 da geliştirdiğiniz yeni bir projeyi açtığınızda uygulamanın aslında ilgili sdk yı bulamadığı hatası ile karşılaştığınızı farkedeceksiniz.

Yine Proje ayarlarına girdiğinizde seçenek olarak sadece 3.2 (iPad demektir) ve 4.0 göreceksiniz. Bu alanlarda daha önceden profil olarak 3.1.3 yada 3.0 gibi versiyonları seçebildiğimizi hepimiz anımsıyoruz. Ancak bu seçenek artık burada değil.

Deployment Target adında yer alan bir alandan Device olarak Base SDK 4.0 bile seçili olsa işletim sistemi versiyonu olarak 3.1.3 bir cihazı veya daha eski bir sürümü seçerek uygulamanızı derleyebilirsiniz. Aynı mantık AppStore uygulama gönderimi sırasında da geçerli olduğu için gönül rahatlığı ile yeni xCode altyapısına geçebilirsiniz.

Açıkcası bununla ilgili bir kaynak bulamadığım için bu yazıyı ve görselleri paylaşmak istedim. Her türlü soru için iletişime geçebilirsiniz. Güzel bir yaz günü dileği ile…

Akın İDİL

Valensas

, , , , , , , , , ,

9 Comments

TableView Section Ekleme Çıkarma

iPhone uygulamalarında zaman zaman tablolara dinamik olarak yeni bölümler (section) eklenip çıkarıldığını görüyoruz. Bu işlem oldukça basit ve birkaç satır kod ile gerçekleştirebilir.

Yapmamız gereken aşağıdaki gibi bir metod eklemekten ibaret:

- (void) insertAndDeleteSections {
 
    UITableView *tv = (UITableView *)self.view;
    [tv beginUpdates];
 
    if([tv numberOfSections] > 1){
         [tv deleteSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationBottom];
    }
 
    [tv insertSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade];
 
    [tv endUpdates];
}

Eğer bu metodu ekleme/silme yapmak istediğimiz noktadan çağırırsak varolan bölümün silinip yerine yenisinin eklendiğini ve tablonun yeniden yüklendiğini göreceğiz. “NSIndexSet” silmek istediğimiz bölümün index bilgisini içeriyor.

Buraya kadar işler kolay ancak dikkat edilmesi gereken ve unutulabilen bir nokta var. Örneğin tablomuzdan bir bölümü sileceğiz ama bir yenisini ekleme ihtiyacımız yok. Bu durumda yukarıdaki metoddan “insertSections” parçasını çıkarıyoruz. Bunu yaptıktan sonra önemli olan “numberOfSectionsInTableView” metodundaki dönüş değerinin yeni bölüm sayısı kadar olması. Aksi takdirde çıkarılan sayı kadar ekleme yapılmadığına dair bir hata alınacaktır. Tabii bu durum silmeyip sadece ekleme yaptığımız durumlar içinde geçerli olacaktır. Bu örnekte “dataRows” eklenen/çıkarılan bölümde gösterilen satırları temsil ediyor. Eğer bu veri yok ise section siliyor ve section sayısını 1′e indiriliyor.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   if([dataRows count] > 0){
      return 2;
   }else { 
      return 1;
   }
}

, ,

1 Comment

Objective-C’de Memory Problemlerinin Giderilmesi

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
parametrelerini set etmeliyiz.

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.

xcode3

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

    debugger2

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:

result02

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

    result13

    , ,

    2 Comments