2011-10-14 4 views
28

Özet:iOS 5'e geçiş yaparken dikkat edilmesi gerekenler için kontrol listemize ekleyebilir misiniz? StackOverflow, iOS 5'e yükseltmek için çalıştığım gibi paha biçilmezdi. Xcode 4.2'den önce kaçırdığım bazı oldukça basit şeyleri keşfettim ve diğer "tuhaflıklar" ın gizlenebileceğini merak ediyorum.iOS 5'e geçiş yaparken nelere dikkat etmelisiniz?

Detay: Bu hafta iOS 5 nakliye ile, birkaç uygulamamda bazı değişiklikler yapmak zorunda kaldım. Xcode 4.2, yeni ARC özelliği nedeniyle bellek yönetimi kodunu analiz eden çok daha iyi bir iş yapıyor. IOS 5 güncellemesi, tüm bellek yönetim kodunuzu gözden geçirebileceğiniz mükemmel bir noktadır. Yeni derleyici ayrıca, önceki derleyicilerin kaçırdığı bir dizi başka sorun da buluyor. Apple derleyici mühendisleri için Kudos. İşte size yardımcı olan temel şeyler (ve bunların çoğu, iOS'un önceki sürümlerine de uygulanacak).

  1. Baştan değil, call [super dealloc] at the END of your dealloc methods olduğundan emin olun. viewDidUnload, some people have reported bugs that require [super viewDidUnload] to be called at the end yılında
  2. değil başlangıç, sizin viewDidUnload ait.
  3. Saklama sayılarını, sentezlenmiş ayarlayıcıları ve serbest bırakma veya otomatik oynatmayı ne zaman arayacağınızı öğrenin. Yeni derleyici, eski derleyicilerden daha fazla sorun çıkaracak. (Dikkatli olduğumu sanıyordum ama görünüşe göre yeterince dikkatli değildim.) Apple'ın memory management guide okuması gerekiyor - kısayol yok.
  4. O (|; Teşhis sekmesinde, Zombi Nesneleri KONTROL Enable Edit Düzeni ... ve hata ayıklama düzenini seçin Xcode, Ürün seçin) turn on zombies when debugging için iyi bir fikirdir. Bu, zombilerin denenmiş kullanımlarını bulmanıza yardımcı olabilir (daha fazla kullanmamanız gereken nesneler).
  5. Kaçaklar aracı da yararlıdır. Uygulamanızı Profil modunda çalıştırın ve Sızıntıları şablonu seçin. Aletler penceresinde, Sızıntı aracını seçin ve "Sızan Bellek İçeriği Topla" yazan kutuyu işaretleyin ve sızan belleğin kodunuzda nereden kaynaklandığını görmenize yardımcı olacaktır.

Birkaç oran vardır ve karşılaştığınız biter:

 
    - (oneway void) release { } 
  • Sen may:

    Ben bakmak gerekir potansiyel tehlikelerin Diğer öneriler? Uygulamalarımın artık daha kararlı olduğunu hissediyorum, ama daha önce onlar hakkında iyi hissettim. Onların boyutunu değiştirerek sanki

+1

Bu bellek yönetimi değil, ancak yine de önemlidir: Eğer herhangi bir veri indirir ve aygıta yerleştirmek istiyorsanız, bunu belgeler klasörüne kaydetmemek için dikkatli olun. Bunun için Kütüphane/Önbellek veya tmp kullanın. Veya uygulama verilerini, paket kimliğiniz tarafından eklenen NSApplicationSupportDirectory dosyasına depolayın. Ayrıntılar için http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW1 sayfasına bakın. –

+1

Bellek yönetimi de değil. Ancak Güvenlik/Sertifika ile ilgili şeyler yapıyorsanız. MD5 hashed sertifikalarının SecTrustEvaluate üzerinde kSecTrustResultRecoverableTrustFailure döndürdüğünü unutmayın. Ios5, MD5 karmalarının güvenli olmadığını düşünür. – n3utrino

+1

IOS5'e geçiş için başka bir şey, kullanımdan kaldırılmış UDID'dir. http://stackoverflow.com/questions/6993325/uidevice-uniqueidentifier-deprecated-what-to-do-now –

cevap

6

1/Modal kontrolörleri, farklı davranır. Farklı boyutlarda kalıcı iletişim kutusuna ihtiyacınız varsa, iOS 5 alt görünüm denetleyicileri kullanmayı düşünün. Eğer IOS 4 nil bölüm başlığı ve pozitif yüksekliği, dönen için bir tablo

2/

, başlık gizlendi. IOS 5'de, sıfır başlıkları için sıfır yüksekliğini döndürmeniz gerekir.

3/UDID kaldırıldı. Eşsiz bir kimlik oluşturmak ve bunları ayarlarınıza kaydetmek için CFUUIDCreate'i kullanabilirsiniz, ancak bir cihaz verilerinin yedeklenip daha sonra başka bir cihaza geri yüklenebileceğini ve aynı kimliğe sahip iki cihaz bıraktığını unutmayın.Kimliğimi kSecAttrAccessibleWhenUnlockedThisDeviceOnly özniteliğiyle anahtar zincirine kaydederek durumu çözdüm.

Listeniz hakkında: [super viewDidUnload] her zaman viewDidUnload'unuzdaki son ifade olarak adlandırılmalıdır. Mantık [süper dealloc] ile aynıdır. Not: Ayrıca, [self viewDidUnload] öğesini kendi ara belleğinizde de çağırmalısınız (eğer belleğinizi zaten serbest bırakmıyorsanız), çünkü örtük olarak adlandırılmadığı için (bazen de olsa).

Deneylerimden, Aygıtlardaki kaçak tespiti, bir özellik adı atamadan sentezlenen özelliklerde sızıntı bildirmez.

+0

Cevabınız için teşekkürler. Benim için bir şeyi açıklayabilir misin? Sanırım ne zaman [super viewDidUnload] çağrısı sorusu üzerinde aynı şeyi söylüyorsun. Ayrıca, [self viewDidUnload] olarak adlandırmanız gereken koşulların önerisini daha net bir şekilde açıklamak için cevabınızı iyileştirir. –

+3

Genel olarak, ARC kullanıyorsanız ve IBOutlet'leriniz zayıfsa, görünüm kaldırıldığında her şey boşalır. Fakat ARC olmadan ve güçlü (korumalı) IBOutlet'lerle (örneğin, bunları dinamik olarak görünümden ekleyip çıkarırsanız), bunları viewDidUnload içinde serbest bırakmak istersiniz. Ancak, bunları da dealloc yönteminizde bırakmak istiyorsunuz. Kod ikilemesini kaldırmak için viewDidUnload öğesini dealloc'tan çağırmanız yeterlidir. Her zaman orada koymalısınız çünkü görüntüleme denetleyicisi serbest bırakıldığında otomatik olarak aranmaz. – Sulthan