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.

BeachRunnerFred
sumber

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.

BinaryStar
sumber
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.

Enzo Tran
sumber
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.

Ole Begemann
sumber
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.

ThomasW
sumber
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)
ChikabuZ
sumber
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
Blazej SLEBODA
sumber
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)
kindaian
sumber
7

Ada perintah menu yang akan memanggilnya.

Hardware > Simulate Memory Warning dari simulator.

Daniel A. White
sumber
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;
   }
ph1lb4
sumber
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.

Vishal Chaudhry
sumber