Pengembangan iOS: Bagaimana saya bisa menyebabkan peringatan memori rendah pada perangkat?


93

Saya ingin menguji fungsi aplikasi saya dengan baik dalam kondisi memori rendah, tetapi sulit untuk menguji. Bagaimana saya bisa menyebabkan peringatan memori rendah yang memicu metode didReceiveMemoryWarning dalam tampilan saya saat aplikasi berjalan di perangkat, bukan simulator? Atau dengan cara apa saja saya dapat menguji aplikasi saya dalam kondisi yang memungkinkan?

Alasan saya tidak dapat menggunakan simulator adalah aplikasi saya menggunakan Game Center dan undangan tidak berfungsi di simulator.

Jawaban:


9

Untuk menguji perangkat, cukup tambahkan beberapa kode yang secara berkala mengalokasikan sebagian besar memori tanpa membebaskannya (yaitu sengaja bocor). Anda dapat melakukannya di utas terpisah, atau sebagai respons terhadap pengatur waktu, atau menggunakan mekanisme apa pun yang paling memungkinkan Anda untuk menguji dan mengamati perilaku aplikasi Anda.

Anda juga dapat memilih untuk membuat aplikasi terpisah yang melakukan hal serupa dan dirancang untuk berjalan di latar belakang, jika Anda ingin menggunakannya kembali dengan mudah dan / atau menguji dengan beberapa aplikasi.


7
tidak terlalu praktis. solusi untuk memanggil metode pribadi untuk pengujian lebih baik
Daij-Djan

5
Bukan solusi yang baik jika Anda ingin melihat skenario dunia nyata. Anda melumpuhkan aplikasi karena kebocoran bukan karena tekanan memori. Itu buruk karena yang ingin Anda lakukan adalah menguji bagaimana aplikasi merespons dalam keadaan tekanan memori tinggi. Di sisi negatifnya, lebih sulit untuk mencari tahu apa masalahnya adalah kebocoran asli atau palsu yang Anda perkenalkan. Metode privat lebih baik untuk pengujian seperti yang diberikan di bawah ini.
fzaziz

2
Jawaban ini tidak boleh diremehkan, karena paragraf kedua sebenarnya adalah apa yang dikatakan Apple untuk dilakukan jika Anda ingin menguji perilaku aplikasi Anda ketika memori benar-benar rendah.
matt

1
Jawaban akan ditingkatkan dengan blok kode untuk melakukan alokasi ini!
pkamb

Meskipun membutuhkan lebih banyak pekerjaan untuk menyiapkannya, ini adalah pengujian yang lebih realistis daripada memanggil metode pribadi. Jika memang ada tekanan memori kritis, apakah aplikasi Anda dapat melakukan tindakan yang Anda perintahkan? Dan apakah tindakan tersebut akan meringankan situasi atau memperburuknya dan menyebabkan iOS menghentikannya? Selain itu, metode pribadi tidak berfungsi untuk menguji DISPATCH_SOURCE_TYPE_MEMORYPRESSURE.
jk7

278

Anda dapat memanggil metode pribadi :

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

Ingatlah untuk menggunakannya hanya pada debug, atau aplikasi Anda akan ditolak.


6
Tampaknya kode ini secara akurat mensimulasikan peringatan memori pada perangkat. Terima kasih Enzo!
William Denniss

28
Alih-alih menggunakan ini dalam kode, jalankan di debugger. Cukup tekan jeda dan masukpo [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
orkoden

17
Daripada menggunakan po, gunakan expr, yaituexpr (void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
Andy

11
Di debugger, Anda tidak perlu menggunakan solusi karena tidak memiliki header:expr (void)[[UIApplication sharedApplication] _performMemoryWarning]
OrangeDog

3
Bagi siapa pun yang ingin melakukan ini dengan Swift: ketik expr UIApplication.sharedApplication().performSelector("_performMemoryWarning")alih-alih menggunakan yang biasa#selector
funct7

29

Simulate Memory WarningItem menu iOS Simulator memungkinkan Anda untuk mensimulasikan peringatan memori.


Satu-satunya cara untuk memeriksanya di perangkat adalah dengan benar-benar memaksanya, yaitu dengan menggunakan aplikasi untuk jangka waktu yang lama atau gambar intensif atau apa pun yang Anda miliki, akan memvariasikan aplikasi ke aplikasi. Sebuah saran mungkin untuk menggunakan perangkat yang lebih lama (3g mungkin?) Daripada iPhone 4 untuk membantu Anda mendapatkan peringatan lebih cepat.
Jesse Naugher

Terima kasih, Jesse, saya rasa saya hanya akan menambahkan beberapa peretasan ke aplikasi saya untuk mensimulasikan undangan sehingga saya dapat menjalankannya di simulator dan memicu peringatan memori seperti itu.
BeachRunnerFred

10
Pertanyaannya adalah tentang simulasi di perangkat.
KPM

20

Menggunakan Instrumen, gunakan item menu: Instrumen -> Simulasikan Peringatan Memori.

Untuk menggunakan Instrumen di aplikasi Anda dari Xcode, gunakan item menu Produk -> Profil.


Ini lebih baik.
Zappel

@OrangeDog Apa yang terjadi?
ThomasW

2
Tidak apa-apa. Ketika saya menggunakan tampilan jawaban Enzo harus memuat ulang ketika saya kembali ke mereka, tidak begitu menggunakan metode ini.
OrangeDog

12

Saya telah menulis ulang jawaban Enzo Tran di Swift:

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

Terima kasih! Xcode memperingatkan "tidak ada metode yang dideklarasikan dengan pemilih Objective-C", tetapi ini tetap berfungsi.
pria1

10

Jika seseorang, karena alasan apa pun, mencoba melakukan ini di Swift 4 - berikut adalah cara mengalokasikan ram 1,2 GB.

let d = Data.init(repeating: 100, count: 1200000000)
  • Ini berguna untuk memicu peringatan di aplikasi lain

Akankah melakukan sesuatu seperti ini mengaburkan informasi memori sebenarnya yang saya coba lihat di Instrumen? Meskipun saya melihat tidak ada cara yang tepat untuk melakukan ini pada perangkat fisik, jika maksud saya adalah melihat apa yang mengambil memori saya dalam aplikasi saya, sepertinya ini akan merusak semua data dan saya tidak akan lagi memiliki jawaban relatif. Saya masih akan melihat mana yang mengambil lebih banyak , tetapi bukan proporsi yang sebenarnya.
Jake T.

ini langsung crash
Daniel Springer

8

Mengonversi @ChikabuZ ke swift 3:

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

7

Ada perintah menu yang akan memanggilnya.

Hardware > Simulate Memory Warning dari simulator.


8
Pertanyaannya adalah tentang simulasi di perangkat.
KPM

2
Di Xcode 10 sekarang di bawah Debug> peringatan Simulasikan Memori.
Sebbo

4

Jika seseorang, karena alasan apa pun, mencoba melakukan ini di Swift 3 - berikut adalah cara mengalokasikan ram 1,2 GB.

   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 (berulang: 100, hitung: 1200000000)
Blazej SLEBODA

2
@Adobels Anda harus memposting itu sebagai jawaban :)
Koen.

1

Cepat 4:

UIApplication.shared.perform (Selector (("_ performMemoryWarning")))

Dapat mengeksekusi hal di atas sebagai respons atas suatu peristiwa / notifikasi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.