Ben Çökme ve hafıza sızıntıları izini sürmek için benim geliştirme sürecinin bir parçası önündeyim. Bir strateji olarak, herhangi bir NSLog mesajları veya bazı tür bildirimlerini içine koyarım didReceiveMemoryWarning:? Bu yöntem için dokümantasyon oldukça seyrek. Bir çarpışma olacağını önce UIViewController bu yöntemi tetikleyecek söylemek doğru mu? Başlangıç noktası mı bile Instruments ile ileriye gitmeden önce?
iOS: didReceiveMemoryWarning yardımseverlik:
Tamam, birkaç şey nota:
- didReceiveMemoryWarning dışı bir bellek çökmesi önce çağrılır. Diğer Değil çöker. düzgün uyarıyı işlemek ve belleği boşaltmak, o zaman dışı bellek durumu önlemek ve çökmesine olamaz.
- El Donanım menüsü altındaki simülatörde bir bellek uyarı tetikleyebilir. Son derece didReceiveMemoryWarning sizin işlenmesini sınamak için bu yapıyor öneriyoruz.
- Gerçekten çöker o kullanışlı değil - (hepsi değil gerçi) Instruments sızıntıları hata ayıklama yardımcı olur.
- Hayır, ben şahsen NSLog kullanmayın - Ben sadece ayıklama ediyorum bellek uyarıları çalışma noktasının.
Kullanıcı bırakılırsa bazı uygulamalar siz emrinde çok az belleğe sahip olacak açın. Yani bazen didReceiveMemoryWarningsadece kullanım 1 MB sonra sistem tarafından çağrılabilir.
Sistem size bakış kontrolörlerinin her bir NSLog yerleştirirseniz, bunu fark edecektir, tüm görünüm denetleyicileri üzerinde bu yöntemi çağırır.
Sonra otomatik yöntem viewDidUnloadtüm görünüm denetleyicileri (değil sistem tarafından çağrılır dealloc). Demek orada tüm deallocation talimatları koymak zorunda.
Eğer uygulama karmaşık ise onu iyi yönetmek önce çöker çok karşı karşıya gelecek çünkü birçok deney yapmak zorunda.
GÜNCELLEME
iOS 6 itibariyle UIViewControllergörünümleri artık hafıza uyarılara cevaben boşaltılır vardır. Bunun yerine sadece zaman makul yeniden oluşturabilirsiniz tüm kaynakları (örneğin önbelleğe alınmış verileri) serbest bırakmak için elinden geleni yap didReceiveMemoryWarningdenir.
GÜNCELLEME
küçükken öfkeli gençken ben özgün cevabım yazdım; zaman değişti ve temelde, bu yanlış.
Tek bir görünüm denetleyicisi ile bir uygulama varsa ve bir bellek uyarısı alırsanız, çok yapabileceğiniz bir şey yok. Birden görünüm denetleyicileri varsa boşaltmak çünkü Ama işler, önemli ölçüde değişebilir bütün sigara öndeki kontrolörleri ile bağlantılı bir durumun. Aslında [UIViewController didReceiveMemoryWarning]sen için görünmeyen görüşlerini boşaltarak doğru yönde eşya olacak (sürpriz!). En öndeki görünüm denetleyicisi görevden edildiğinde, altta yatan görünümü yeniden yüklenir ve en fazla kullanıcı sadece içten uygulama tam bir yeniden başlatma yapmış olsa bile bir gecikme bilmelidir.
Bu kolayca güçlendirme bazı detay değil, baştan akılda bellek kullanımını tutmak ve temiz Unloadable içine bakıslı uygulamasını tasarlamak için ihtiyaç UIViewControlleradet. Aslında bu sadece kendi hafıza uyarı özelliği kullanmak için simülatör ile kod uyumlu tutmak değer.
Bellek bol olduğunda, hiçbir şey yüksüz olduğu ve her şey pürüzsüz ipeksi ve belleği azaldığında işler daha yavaş da olsa, çalışmaya devam. Şimdi sonlu bellek sorununa bu çözüm ideal olduğunu söyleyebilirim.
Aşırı, bu bellek salonu hile yararlanmak için UIViewControlleryöntemler
viewDidLoad, viewDidUnloadve
viewWillUnload(iOS 5, kullanışlı boşaltma durumunda size tampon OpenGL dokuları sızıntı ve işlemek için istemiyorsanız hala iOS4 üzerinde simüle edebilir, örneğin varolma görünümünüzü gerektiriyorsa Bu aşırı yüklenerek didReceiveMemoryWarning) ve görünümün görünürlüğünü izleme.
ORİJİNAL, DAHA bilious YANIT
didReceiveMemoryWarning kesinlikle işe yaramaz.
ölebilirsin olmaz (hatta tümü) Belleği boşaltmak durumunda hiçbir garantisi yoktur.
Benim acı deneyiminde genellikle 2.x / 3.0 bu gibi çalışır:
mediaserverd bellek demet sızıntıları
Benim app öldürülmeden
Maalesef, orak mediaserverd öldürme düşünmez.
bellek kullanımı sizin suçunuz değil, eğer öyleyse, gerçekten sadece iki seçeneğin var:
yeniden başlatmak için kullanıcı sormak (bu senin hatan kullanıcı varsayar, bir kırıcı eleştiri yazan)
Suçlu çöküyor umut (mediaserverd genellikle mecbur!)
didReceiveMemoryWarning amacı size belleği boşaltmak veya kaza önlemek için görünümleri pop için bir şans vermektir. o kullanıcının yaptıklarını bağlıdır çünkü herhangi öngörülebilir noktada almaz. kullanıcı iPod dinlerken Örneğin, orada verilen bellek ve siz daha once alacaksınız.
Genel kural Birlikte çalışma konusunda RAM 8MB hakkında olması. Bunu yakın olsun olay yükseltilmiş olması bekleniyor. Eğer bu kadar RAM kadar alıyor ise kasten bu konuda bir şeyler yapmak için bir planı olmalıdır.













