iOS Geliştirme: Cihazda düşük bellek uyarılarını nasıl tetikleyebilirim?


93

Düşük bellek koşullarında uygulama işlevlerimi iyi test etmek istiyorum, ancak test etmek zor. Uygulama simülatörde değil cihazda çalışırken görünümlerimde didReceiveMemoryWarning yöntemini tetikleyen düşük bellek uyarılarını nasıl indükleyebilirim? Veya bu olası koşullar altında uygulamamı test edebileceğim bazı yollar nelerdir?

Simülatörü kullanamamamın nedeni uygulamamın Game Center'ı kullanması ve davetler simülatörde çalışmaması.

Yanıtlar:


9

Bir aygıt üzerinde test etmek için, büyük bellek parçalarını serbest bırakmadan periyodik olarak ayıran bir kod ekleyin (yani kasıtlı olarak sızıntı). Bunu ayrı bir iş parçacığında veya bir zamanlayıcıya yanıt olarak veya uygulamanızın davranışını test etmenize ve gözlemlemenize en iyi olanak tanıyan mekanizmayı kullanarak yapabilirsiniz.

Bunu kolayca yeniden kullanmak ve / veya birden fazla uygulamayla test etmek istiyorsanız, benzer bir şey yapan ve arka planda çalışacak şekilde tasarlanmış ayrı bir uygulama oluşturmayı da seçebilirsiniz.


7
çok pratik değil. test için özel bir yöntem çağırmanın çözümü daha iyidir
Daij-Djan

5
Gerçek dünya senaryosuna bakmak istiyorsanız iyi bir çözüm değil. Bellek baskısından kaynaklanmayan bir sızıntı nedeniyle uygulamayı sakat bırakıyorsunuz. Bu kötü çünkü yapmak istediğiniz şey, uygulamanın yüksek bellek baskısı durumunda nasıl tepki verdiğini test etmek. Olumsuz tarafı, sorunun gerçek bir sızıntı veya sizin ortaya çıkardığınız sahte bir sorun olduğunu anlamak daha zordur. Özel yöntem, aşağıda verildiği gibi test etmek için daha iyidir.
fzaziz

2
İkinci paragraf aslında, uygulamanızın bellek gerçekten azaldığında davranışını test etmek istiyorsanız, Apple'ın söylediği şey olduğundan, bu yanıt geri alınmamalıdır.
mat

1
Bu tahsisi gerçekleştirmek için yanıt bir kod bloğu ile geliştirilebilir!
pkamb

Kurulum için daha fazla çalışma gerekse de, bu özel yöntemi çağırmaktan daha gerçekçi bir testtir. Gerçekten kritik bellek baskısı olduğunda, uygulamanız yapmasını söylediğiniz eylemleri gerçekleştirebilecek mi? Ve bu eylemler durumu hafifletecek mi yoksa daha da kötüleştirecek ve iOS'un onu sonlandırmasına neden olacak mı? Ayrıca, özel yöntem DISPATCH_SOURCE_TYPE_MEMORYPRESSURE'ü test etmek için çalışmaz.
jk7

278

Özel yöntemi çağırabilirsiniz :

[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

Sadece hata ayıklamada kullanmayı unutmayın, aksi takdirde uygulamanız reddedilir.


6
Görünüşe göre bu kod, cihazdaki hafıza uyarısını doğru şekilde simüle ediyor. Teşekkürler Enzo!
William Denniss

28
Bunu kodda kullanmak yerine, hata ayıklayıcıda yürütün. Duraklat'a basın ve girinpo [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
orkoden

17
Po kullanmak yerine ifade kullanın, yaniexpr (void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
Andy

11
Hata ayıklayıcıda, başlığa sahip olmamak için geçici çözümü kullanmanıza gerek yoktur:expr (void)[[UIApplication sharedApplication] _performMemoryWarning]
OrangeDog

3
Swift ile bunu yapmak isteyen herkes için: expr UIApplication.sharedApplication().performSelector("_performMemoryWarning")her zamanki gibi yazmak yerine#selector
funct7

30

İOS Simulator'un Simulate Memory Warningmenü öğesi, bir hafıza uyarısını simüle etmenize olanak tanır.


Cihazda kontrol etmenin tek yolu onu gerçekten zorlamaktır, yani uygulamayı uzun süre kullanmak veya yoğun görüntüler veya elinizde ne varsa, uygulamadan uygulamaya değişecektir. Uyarıya daha hızlı ulaşmanıza yardımcı olması için iPhone 4 yerine daha eski bir cihaz (belki 3g?) Kullanmanız bir öneri olabilir.
Jesse Naugher

Teşekkürler Jesse, sanırım davetleri simüle etmek için uygulamama bazı hackler ekleyeceğim, böylece onu simülatörde çalıştırabilir ve hafıza uyarılarını bu şekilde başlatabilirim.
BeachRunnerFred

10
Soru cihazdaki simülasyonla ilgiliydi.
KPM

20

Aletleri kullanarak şu menü öğesini kullanın: Alet -> Bellek Simülasyonu Uyarısı.

Enstrümanları uygulamanızda Xcode'dan kullanmak için Ürün -> Profil menü öğesini kullanın.


Bu daha da iyi.
Zappel

@OrangeDog Neler oluyor?
ThomasW

2
Şey, hiçbir şey. Enzo'nun yanıt görünümlerini kullandığımda, onlara geri döndüğümde yeniden yüklemem gerekiyor, bu yöntemi kullanmam.
OrangeDog

12

Enzo Tran'ın cevabını Swift'de yeniden yazdım :

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)

Teşekkürler! Xcode, "Objective-C seçicisi ile bildirilmemiş hiçbir yöntem" konusunda uyarır, ancak bu yine de çalışır.
adam1

10

Birisi herhangi bir nedenle Swift 4'te bunu yapmaya çalışırsa - işte 1.2 GB ram ayırmanın yolu.

let d = Data.init(repeating: 100, count: 1200000000)
  • Bu, diğer uygulamalarda bir uyarı uyarısı tetiklemeye yardımcı olur

Bunun gibi bir şey yapmak, Enstrümanlar'da görüntülemeye çalıştığım gerçek hafıza bilgilerini gizler mi? Bunu fiziksel bir cihazda yapmanın uygun bir yolu olmadığını görsem de, amacım uygulamamdaki hafızamı neyin kapladığını görmekse, bu tüm verileri çarpıtacak gibi görünüyor ve hayır artık göreceli bir cevaba sahip. Hala neyin daha fazla olduğunu göreceğim , ancak gerçek oranları göremeyeceğim .
Jake T.

bu hemen çöküyor
Daniel Springer

8

@ChikabuZ, hızlı 3'e dönüştürüldü:

UIControl().sendAction(Selector(("_performMemoryWarning")), to: UIApplication.shared, for: nil)

7

Onu çağıracak bir menü komutu var.

Hardware > Simulate Memory Warning simülatörden.


8
Soru cihazdaki simülasyonla ilgiliydi.
KPM

2
Xcode 10'da artık Debug> Simulate Memory uyarısı altındadır.
Sebbo

4

Birisi herhangi bir nedenle Swift 3'te bunu yapmaya çalışırsa - işte 1.2 GB ram ayırmanın yolu.

   for i in 0...1200 {
      var p: [UnsafeMutableRawPointer] = []
      var allocatedMB = 0
      p.append(malloc(1048576))
      memset(p[allocatedMB], 0, 1048576);
      allocatedMB += 1;
   }

3
let d = Data.init (yinelenen: 100, sayım: 1200000000)
Blazej SLEBODA

2
@Adobels bunu bir cevap olarak göndermelisiniz :)
Koen.

1

Swift 4:

UIApplication.shared.perform (Seçici (("_ performMemoryWarning")))

Bir olay / bildirime yanıt olarak yukarıdakileri yürütebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.