การพัฒนา iOS: ฉันจะทำให้เกิดคำเตือนหน่วยความจำต่ำบนอุปกรณ์ได้อย่างไร


93

ฉันต้องการทดสอบการทำงานของแอปในสภาวะที่มีหน่วยความจำต่ำ แต่ทดสอบได้ยาก ฉันจะทำให้เกิดคำเตือนหน่วยความจำเหลือน้อยที่ทริกเกอร์เมธอด didReceiveMemoryWarning ในมุมมองของฉันได้อย่างไรเมื่อแอปกำลังทำงานบนอุปกรณ์ไม่ใช่โปรแกรมจำลอง หรือมีวิธีใดบ้างที่ฉันสามารถทดสอบแอปของฉันภายใต้เงื่อนไขที่เป็นไปได้เหล่านี้

สาเหตุที่ฉันไม่สามารถใช้โปรแกรมจำลองได้เนื่องจากแอปของฉันใช้ Game Center และคำเชิญไม่สามารถใช้งานได้บนเครื่องจำลอง

คำตอบ:


9

ในการทดสอบบนอุปกรณ์เพียงแค่เพิ่มโค้ดบางส่วนที่จัดสรรหน่วยความจำขนาดใหญ่เป็นระยะ ๆ โดยไม่ต้องปล่อยออกมา คุณสามารถทำได้ในเธรดที่แยกจากกันหรือเพื่อตอบสนองต่อตัวจับเวลาหรือใช้กลไกอะไรก็ได้ที่ช่วยให้คุณทดสอบและสังเกตพฤติกรรมของแอปพลิเคชันของคุณได้ดีที่สุด

คุณอาจเลือกสร้างแอปแยกต่างหากที่ทำสิ่งที่คล้ายกันและได้รับการออกแบบมาให้ทำงานในพื้นหลังหากคุณต้องการใช้ซ้ำและ / หรือทดสอบกับแอปพลิเคชันหลาย ๆ


7
ไม่ค่อยมีประโยชน์ วิธีแก้ปัญหาในการเรียกวิธีการทดสอบแบบส่วนตัวจะดีกว่า
Daij-Djan

5
ไม่ใช่ทางออกที่ดีหากคุณต้องการดูสถานการณ์ในโลกแห่งความเป็นจริง คุณกำลังทำให้แอปพลิเคชันพิการเนื่องจากการรั่วไหลไม่ได้เกิดจากแรงกดดันของหน่วยความจำ นั่นไม่ดีเนื่องจากสิ่งที่คุณต้องการทำคือทดสอบว่าแอปตอบสนองอย่างไรในสภาวะกดดันหน่วยความจำสูง ในทางกลับกันมันยากที่จะเข้าใจว่าปัญหาคืออะไรรั่วจริงหรือของปลอมที่คุณแนะนำ วิธีส่วนตัววิธีหนึ่งดีกว่าสำหรับการทดสอบตามที่ระบุด้านล่าง
fzaziz

2
คำตอบนี้ไม่ควรลงคะแนนเนื่องจากย่อหน้าที่สองเป็นสิ่งที่ Apple บอกให้ทำหากคุณต้องการทดสอบพฤติกรรมของแอปเมื่อหน่วยความจำเหลือน้อยจริงๆ
แมตต์

1
คำตอบจะได้รับการปรับปรุงด้วยบล็อกรหัสเพื่อดำเนินการจัดสรรนี้!
pkamb

แม้ว่าจะต้องใช้เวลาในการตั้งค่ามากกว่า แต่นี่เป็นการทดสอบที่เป็นจริงมากกว่าการเรียกใช้เมธอดส่วนตัว เมื่อมีความกดดันด้านหน่วยความจำขั้นวิกฤตจริงๆแอปของคุณจะสามารถดำเนินการตามที่คุณสั่งให้ทำได้หรือไม่ และการกระทำเหล่านั้นจะบรรเทาสถานการณ์หรือทำให้แย่ลงและทำให้ iOS ยุติการใช้งานหรือไม่? นอกจากนี้วิธีการส่วนตัวใช้ไม่ได้กับการทดสอบ DISPATCH_SOURCE_TYPE_MEMORYPRESSURE
jk7

278

คุณสามารถเรียกวิธีส่วนตัว :

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

อย่าลืมใช้เพื่อแก้ไขข้อบกพร่องเท่านั้นมิฉะนั้นแอปของคุณจะถูกปฏิเสธ


6
ดูเหมือนว่ารหัสนี้จะจำลองคำเตือนหน่วยความจำบนอุปกรณ์ได้อย่างแม่นยำ ขอบคุณ Enzo!
William Denniss

28
แทนที่จะใช้สิ่งนี้ในโค้ดให้ดำเนินการในดีบักเกอร์ เพียงกดหยุดชั่วคราวแล้วเข้าสู่po [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
orkoden

17
แทนที่จะใช้ po ให้ใช้ expr เช่นexpr (void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
Andy

11
ในการดีบักเกอร์คุณไม่จำเป็นต้องใช้วิธีแก้ปัญหาสำหรับการไม่มีส่วนหัว:expr (void)[[UIApplication sharedApplication] _performMemoryWarning]
OrangeDog

3
สำหรับใครที่ต้องการทำสิ่งนี้ด้วย Swift: พิมพ์expr UIApplication.sharedApplication().performSelector("_performMemoryWarning")แทนการใช้แบบปกติ#selector
funct7

30

Simulate Memory Warningรายการเมนูของ iOS Simulator ช่วยให้คุณจำลองคำเตือนหน่วยความจำ


วิธีเดียวที่จะตรวจสอบบนอุปกรณ์คือการบังคับมันจริง ๆ เช่นการใช้แอพเป็นเวลานานหรือรูปภาพที่เข้มข้นหรือสิ่งที่คุณมี คำแนะนำอาจให้ใช้อุปกรณ์รุ่นเก่า (อาจจะเป็น 3g) แทน iPhone 4 เพื่อช่วยให้คุณได้รับคำเตือนเร็วขึ้น
Jesse Naugher

ขอบคุณเจสซี่ฉันคิดว่าฉันแค่จะเพิ่มแฮ็กบางอย่างในแอปของฉันเพื่อจำลองคำเชิญเพื่อให้ฉันสามารถเรียกใช้มันในโปรแกรมจำลองและกระตุ้นเตือนความทรงจำในลักษณะนั้น
BeachRunnerFred

10
คำถามเกี่ยวกับการจำลองบนอุปกรณ์
KPM

20

การใช้เครื่องดนตรีให้ใช้รายการเมนู: เครื่องมือ -> จำลองคำเตือนหน่วยความจำ

หากต้องการใช้เครื่องมือในแอปของคุณจาก Xcode ให้ใช้รายการเมนูผลิตภัณฑ์ -> โปรไฟล์


นี้จะดียิ่งขึ้น
Zappel

@OrangeDog เกิดอะไรขึ้น?
ThomasW

2
ดีไม่มีอะไร เมื่อฉันใช้มุมมองคำตอบของ Enzo ต้องโหลดซ้ำเมื่อฉันกลับไปที่พวกเขาไม่ใช้วิธีนี้
OrangeDog


10

หากมีใครบางคนพยายามทำสิ่งนี้ใน Swift 4 ไม่ว่าจะด้วยเหตุผลใดก็ตาม - นี่คือวิธีจัดสรร ram 1.2 GB

let d = Data.init(repeating: 100, count: 1200000000)
  • สิ่งนี้มีประโยชน์ในการเรียกใช้การแจ้งเตือนในแอปอื่น ๆ

การทำสิ่งนี้จะทำให้ข้อมูลหน่วยความจำจริงที่ฉันพยายามดูใน Instruments สับสนหรือไม่ ในขณะที่ฉันเห็นว่าไม่มีวิธีที่เหมาะสมในการทำสิ่งนี้บนอุปกรณ์ทางกายภาพหากประเด็นของฉันคือการดูว่าอะไรกำลังใช้หน่วยความจำของฉันภายในแอพของฉันดูเหมือนว่าข้อมูลนี้จะบิดเบือนข้อมูลทั้งหมดและฉันจะไม่ทำ มีคำตอบญาติอีกต่อไป ฉันจะยังคงเห็นว่าอะไรเพิ่มขึ้นแต่ไม่ใช่สัดส่วนที่แท้จริง
Jake T.

สิ่งนี้ล่มทันที
Daniel Springer


7

มีคำสั่งเมนูที่จะเรียกใช้

Hardware > Simulate Memory Warning จากเครื่องจำลอง


8
คำถามเกี่ยวกับการจำลองบนอุปกรณ์
KPM

2
ใน Xcode 10 ตอนนี้อยู่ภายใต้การแก้ปัญหา> จำลองคำเตือนหน่วยความจำ
Sebbo

4

หากมีใครบางคนพยายามทำสิ่งนี้ใน Swift 3 ไม่ว่าจะด้วยเหตุผลใดก็ตาม - นี่คือวิธีจัดสรร 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
ให้ d = Data.init (ทำซ้ำ: 100 จำนวน: 1200000000)
Blazej SLEBODA

2
@Adobels คุณควรโพสต์เป็นคำตอบ :)
Koen

1

Swift 4:

UIApplication.shared.perform (ตัวเลือก (("_ performMemoryWarning")))

สามารถดำเนินการข้างต้นเพื่อตอบสนองต่อเหตุการณ์ / การแจ้งเตือน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.