2014-10-10 16 views
8

Özel KeyBoard iOS 8Özel KeyBoard nedeniyle

Başlangıçta benim özel klavye bellek 25MB etrafında alıyor bellek baskısı nedeniyle sonlandırılabilir iOS 8'de bellek basınca sonlandırılabilir ama dissmiss ile bu bellek ayırmanın değil tuş takımı. Özel klavye açılıp tekrar açıldığında ve bellek baskısı nedeniyle sonlandırıldığında bellek artar.

Bu sorundan kurtulmama yardım eder misiniz?

+0

Kodunuzu, tam olarak sorunla karşılaştığınız yere gönderebilir misiniz? – iGW

cevap

1

Sen KeyboardViewController

1

klavye uzatma klavye kaybolur sonra devam bir süreç içinde çalışır arasında ViewWillDisappear fonksiyonunda bazı şeyleri dealloc edebilirsiniz. Klavyenizin denetleyicisi klavyeniz her oluşturulduğunda yeniden oluşturulur, ancak denetleyicinin görüntülediği işlem devam eder. Görüntü denetleyiciniz kapalıyken boş bellek. Eğer görüntüleri kullanıyorsanız imageNamed'i kullanmak istemezsiniz: imageWithContentsOfFile: 'ı kullanmak isteyeceksiniz. UIImage, kalıcı olacak imageNamed için bir önbellek kullandığından. Bir klavye kaybolmadan önce

1

Ben bu ünlü bellek birikimi sorunu önlemek için yollar tonlarca çalıştı, ama benim uzun uzun yargılanma & hataları göre gelmiş, en iyi ve en basit yolu tüm belleği boşaltmak için KeyboardViewController arasında viewWillDisappear yılında exit(0) çağırmaktır .exit(0)

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    exit(0); 
} 

[Güncelleme] bu klavye uzatma işlemi öldürür çünkü tüm belleği serbest bırakmak için mükemmeldi. Ne yazık ki, süreci öldürmek iOS'u istikrarsız yapıyor.
Sonuç olarak, en kararlı yol, tüm ayrılmış nesneleri viewWillDisappear içinde mümkün olduğunca serbest bırakmaktır. Tüm özel görünümler için örneğin,

ve tüm özel görünüm denetleyicileri için

  • böyle devam subviews, kısıtlamalar, jestler, güçlü delege ve aynı görüş ve bakış kontrolörleri, tüm güçlü içeriği kaldırın. görünüşüdür denetleyicilerinin nesne özellikleri için

    [aView removeFromSuperview]; 
    [aView removeConstraints:aView.constraints]; 
    for (UIGestureRecognizer *recognizer in aView.gestureRecognizers) 
        [aView removeGestureRecognizer:recognizer]; 
    
  • ayarlayın nil. Diğer büyük özel İçin

aViewController.anObject = nil; 

  • benzeri tüm diziler, sözlükler tüm eklenen nesneleri kaldırın ve nesneleri. imageNamed: kullanarak

    [anArray removeAllObjects]; 
    
  • önbelleğe Al görüntüler.

de serbest, bellek kullanımı ayıklama artış olmaz ise ya da çok az (işten başına < 0.1MBytes) artmıştır. Özel nesneler mümkün olduğunca serbest bırakılsa bile, bir çok görevden alındıktan sonra bellek kullanımı artırılırsa, çıkış (0) belirli bir boşaltma riskiyle periyodik olarak çağrılabilir.

+0

Sizin gibi bu sorunu ele alıyorum. Çıkış yaptım (0), süper etkili. Sadece süreci öldürür. Ancak, klavye her zaman yavaşlatır. IOS'un daha hızlı işlem yapabilmesi için klavyeyi önbelleğe aldığını düşünüyorum. Tüm alt görünümleri, kısıtlamaları kaldırmayı denedim, ancak işlem hala var gibi görünüyor ve klavyeyi her kullandığımda bellek hala artar :( – TomSawyer

+0

Genel olarak, oluşturduğunuz tüm özel "nesneler" önce viewWillDisappear'da kaldırılmalıdır Ancak asıl nokta, iOS bellek sızıntısını ve nihayetinde klavye çökmesini önlemek için yalnızca özel görünümleri ve kısıtlamaları değil, tüm özel "nesneleri" silmeniz gerekir. Ayrıca dizileri, sözlükleri, kümeleri veya herhangi bir nesneyi kaldırıp kaldırmadığınızı kontrol edin. Gerçekten can sıkıcı ama işe yarıyor – NeonBerry

+0

İçerdiği tüm nesneleri çıkardım: sınıf örneği, kısıtlamalar, görünümler, sözlükler ... Ve bazı uygulamalar (viber) gibi çalışmayı başaramadı, nedenini bilmiyorum. bazı değişkenleri bırakmak zorundayım ve eğer tüm görünümleri zaten kaldırmış olsaydım, kısıtlamaları ve jestleri kaldırmam gerekiyor mu? Temel olarak, eğer görüşleri kaldırırsam, kısıtlamalar otomatik olarak r çok emoved. – TomSawyer

İlgili konular