2012-04-01 16 views
6

Uygulamamı oluşturmak için Xcode 4.3.1, iOS 5.1 ve ARC açık sahibim.uygulaması hata ayıklama yapısıyla sorunsuz çalışır, ancak sürüm oluşturma işleminde kilitlenme, olası nedenler neler olabilir?

Artık uygulama, hata ayıklama oluşturma işleminde sorunsuz çalışıyor ancak sürüm oluşturma işleminde kilitleniyor. Farkın sebebi ne olabilir? Kaynak yönetimi için tamamen ARC'a güveniyorum. Kilitlenme günlüğüne baktım, bu referans verilen belleğin zaten yayınlandığını gösteriyor. ARC kullanırken, perakende oluşturma sorununa neden olabilecek yaygın tuzaklar neler olacak?

aşağıdaki

Ben

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x6f636552 
Crashed Thread: 0 

DÜZENLEME

uygulamanın dağıtım hedef iOS 5.0 olduğunu kazasında günlüğünden ne var olmasıdır. İnternet bağlantılarını kullanıyorum, şu andaki kilitlenme, UITableViewController'da gösterilmek üzere web hizmetinden döndürülen verileri "oluştururken" gerçekleşiyor. Tüm uygulama ARC kapalı olduğu 3. parti bir kaç kaynak dosyaları hariç, ARC kullanıyor.

+0

Pls daha fazla ipucu, dağıtım hedefi, internet bağlantısı kullanıyor musunuz? Tüm sınıf kullanma ARC ya da sadece bazıları? – Andrea

+0

tamamlandı, lütfen – tom

+0

üzerindeki güncellemelere bakın Bence sim üzerinde zombi aletleri kullanarak uygulamanızı test etmek daha iyidir. ARC ve ARC olmayan sınıfları karıştırmanız, delegasyon veya bildirim kalıplarını kullanarak bazı sorunlara yol açabilir. Neden sadece cihaz üzerinde ve sim üzerinde değil, neden oluyor anlamak zor, ama muhtemelen ikisi arasındaki donanım farklılıkları nedeniyle. – Andrea

cevap

0

cevabı olmayabilir ama denemek için birkaç önsezileri listelemek için gidiyorum:

  • senin tarafında üzerinde bir "kulp" olmadan yöntemleri içine nesneleri geçen olmadığından emin olun . Ve örnek, bir temsilci sınıfı örneğini bir temsilci bekleyen bir yönteme geçiriyordu. Yöntem bu örneği korumaz ve böylece yöntemi çağırmadan önce serbest kalır.
  • Ön derleyici makrolarınızı hem DEBUG & RELEASE için güvenli olduklarını kontrol edin. İyi bir örnek, sürüm oluşturmalarında kaldırılan bir makro üzerinde if ifadesine sahip olmaktır ve if bildirimi, kaşlı ayraçlarla örtülmez.
  • Kodunuzun belirli bölümlerini (#if koşullarını kullanarak) etkinleştirmek/devre dışı bırakmak için derleyici tanımlarına bağlıysanız, gerekli olanların yapı yapılandırmanızda ayarlandığından emin olun.

Daha fazlasını düşünebilirsem, bunları eklemeyi deneyeceğim.

4

Bana böyle bir şey geldiğinde, yayın sürümleri zayıf referansları temizlemeyle ilgili daha agresif olduğu için görünmektedir. Zayıf bir özelliğe yanlışlıkla bir şey atarsanız (örneğin, zayıf referanslar da alacağınız alt görünümler ekliyorsanız), güçlü bir başvuru göndermeden önce, bu hata ayıklama üzerinde çalışabilir ve serbest bırakma başarısız olabilir. Örneğin (pseudocode)

@property (weak) UILabel * label; 
... 
self.label = [[UILabel alloc] init]; 
[self.view addSubview:self.label]; 
... 
self.label.text = @"hello"; 

ben serbest bırakılması üzerine kötü erişim çöker oluşturur bu neden gördüm ve debug fark edilmeyebilir.

+0

evet, bu kesinlikle bir çarpışmaya yol açabilir ve bir hatadır. SADECE zayıf bir ref başvurusunda bulunmamalısınız. –

0

Sürüm ve hata ayıklama için farklı bir hedefiniz var mı? Tüm dosyaların serbest bırakma hedefi için doğru bir şekilde referans alındığını kontrol edin. Bizim olgumuzda, UIButton'da serbest bırakma hedefi tarafından bir kategori görülmemiştir. Bir kişi, o kategori tarafından uygulanan bir yöntemi kullanmaya başlayana kadar, bir geçici çözüm geliştirdi. Ad-Hoc yapısından bir arşiv saklamadığımızdan, bir çökmenin hatalarını ayıklamanın bir yolu yoktu.(öğrenilen ders)

Bir kilitlenme günlüğünde EXC_BAD_ACCESS olarak listelenip listelenmediğinden emin olun, ancak bir kullanıcıya sürümüne özgü kilitlenmeyi tanımlamasına yardımcı olabilirsiniz.

İlgili konular