Phát triển iOS: Làm cách nào để tạo cảnh báo bộ nhớ thấp trên thiết bị?


91

Tôi muốn kiểm tra các chức năng ứng dụng của mình tốt trong điều kiện bộ nhớ thấp, nhưng rất khó để kiểm tra. Làm cách nào để tạo cảnh báo bộ nhớ thấp kích hoạt phương thức didReceiveMemoryWarning trong chế độ xem của tôi khi ứng dụng đang chạy trên thiết bị, không phải trình mô phỏng? Hoặc một số cách để tôi có thể kiểm tra ứng dụng của mình trong những điều kiện có thể này là gì?

Lý do tôi không thể sử dụng trình mô phỏng là ứng dụng của tôi sử dụng Game Center và lời mời không hoạt động trên trình mô phỏng.

Câu trả lời:


8

Để kiểm tra trên một thiết bị, chỉ cần thêm một số mã phân bổ định kỳ khối bộ nhớ lớn mà không cần giải phóng nó (tức là cố ý rò rỉ). Bạn có thể thực hiện việc này trong một chuỗi riêng biệt hoặc để phản hồi bộ đếm thời gian, hoặc sử dụng bất kỳ cơ chế nào cho phép bạn kiểm tra và quan sát hành vi của ứng dụng của mình một cách tốt nhất.

Bạn cũng có thể chọn tạo một ứng dụng riêng có chức năng tương tự và được thiết kế để chạy trong nền, nếu bạn muốn dễ dàng sử dụng lại ứng dụng này và / hoặc thử nghiệm với nhiều ứng dụng.


7
không thực tế lắm. giải pháp gọi một phương pháp riêng để thử nghiệm tốt hơn
Daij-Djan

4
Không phải là một giải pháp tốt nếu bạn muốn nhìn vào viễn cảnh thế giới thực. Bạn đang làm tê liệt ứng dụng do rò rỉ không phải do áp lực bộ nhớ. Điều đó thật tệ vì những gì bạn muốn làm là kiểm tra cách ứng dụng phản hồi trong trạng thái áp suất bộ nhớ cao. Mặt khác, khó tìm ra vấn đề là rò rỉ thật hay rò rỉ giả mà bạn đã giới thiệu. Phương pháp riêng tư tốt hơn để thử nghiệm như được đưa ra bên dưới.
fzaziz

2
Câu trả lời này không nên bị phản đối, vì đoạn thứ hai thực sự là những gì Apple nói phải làm nếu bạn muốn kiểm tra hành vi của ứng dụng khi bộ nhớ thực sự thấp.
matt

1
Câu trả lời sẽ được cải thiện với một khối mã để thực hiện phân bổ này!
pkamb

Mặc dù phải mất nhiều công sức hơn để thiết lập, nhưng đây là một thử nghiệm thực tế hơn là gọi phương thức riêng tư. Khi thực sự có áp lực bộ nhớ quan trọng, liệu ứng dụng của bạn có thể thực hiện các hành động mà bạn yêu cầu nó làm không? Và những hành động đó sẽ làm giảm tình hình hay làm cho nó tồi tệ hơn và khiến iOS phải chấm dứt nó? Bên cạnh đó, phương pháp riêng tư không hoạt động để kiểm tra DISPATCH_SOURCE_TYPE_MEMORYPRESSURE.
jk7

278

Bạn có thể gọi phương thức private :

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

Chỉ cần nhớ chỉ sử dụng nó khi gỡ lỗi, nếu không ứng dụng của bạn sẽ bị từ chối.


6
Nó xuất hiện mã này mô phỏng chính xác cảnh báo bộ nhớ trên thiết bị. Cảm ơn Enzo!
William Denniss

28
Thay vì sử dụng nó trong mã, hãy thực thi nó trong trình gỡ lỗi. Chỉ cần nhấn pause và nhậppo [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
orkoden

17
Thay vì sử dụng po, sử dụng expr, tứcexpr (void)[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
Andy

11
Trong trình gỡ lỗi, bạn không cần sử dụng giải pháp thay thế cho việc không có tiêu đề:expr (void)[[UIApplication sharedApplication] _performMemoryWarning]
OrangeDog

3
Đối với bất kỳ ai đang tìm cách thực hiện việc này với Swift: hãy nhập expr UIApplication.sharedApplication().performSelector("_performMemoryWarning")thay vì sử dụng thông thường#selector
funct 7

27

Mục Simulate Memory Warningmenu của Trình mô phỏng iOS cho phép bạn mô phỏng cảnh báo bộ nhớ.


Chỉ có cách để kiểm tra nó trên thiết bị là thực sự buộc nó, tức là bằng cách sử dụng ứng dụng trong thời gian dài hoặc hình ảnh chuyên sâu hoặc những gì có bạn, sẽ thay đổi ứng dụng với ứng dụng. Một gợi ý có thể là sử dụng thiết bị cũ hơn (có lẽ là 3g?) Thay vì iPhone 4 để giúp bạn nhận được cảnh báo nhanh hơn.
Jesse Naugher

Cảm ơn Jesse, tôi nghĩ tôi sẽ thêm một số bản hack vào ứng dụng của mình để mô phỏng lời mời để tôi có thể chạy nó trong trình mô phỏng và tạo ra cảnh báo bộ nhớ theo cách đó.
BeachRunnerFred

10
Câu hỏi về mô phỏng trên thiết bị.
KPM

20

Sử dụng Instruments, hãy sử dụng mục menu: Instrument -> Simulator Memory Warning.

Để sử dụng Công cụ trên ứng dụng của bạn từ Xcode, hãy sử dụng mục menu Sản phẩm -> Hồ sơ.


Điều này thậm chí còn tốt hơn.
Zappel

@OrangeDog Điều gì đang xảy ra?
ThomasW

2
Cũng không có gì. Khi tôi sử dụng các khung nhìn câu trả lời của Enzo phải tải lại khi tôi quay lại chúng, không nên sử dụng phương pháp này.
OrangeDog

12

Tôi đã viết lại câu trả lời của Enzo Tran bằng Swift:

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

Cảm ơn! Xcode cảnh báo "không có phương thức nào được khai báo với bộ chọn Objective-C", nhưng điều này vẫn hoạt động.
man1

10

Nếu ai đó, vì bất kỳ lý do gì, cố gắng thực hiện điều này trong Swift 4 - đây là cách cấp 1,2 GB ram.

let d = Data.init(repeating: 100, count: 1200000000)
  • Điều này rất hữu ích để kích hoạt cảnh báo cảnh báo trong các ứng dụng khác

Làm điều gì đó như thế này có làm xáo trộn thông tin bộ nhớ thực mà tôi đang cố xem trong Instruments không? Mặc dù tôi thấy không có cách thích hợp để thực hiện việc này trên một thiết bị vật lý, nhưng nếu quan điểm của tôi là xem những gì đang chiếm bộ nhớ trong ứng dụng của tôi thì có vẻ như điều này sẽ làm lệch tất cả dữ liệu và tôi sẽ không còn một câu trả lời tương đối. Tôi vẫn sẽ thấy những gì đang chiếm nhiều hơn , nhưng không phải là tỷ lệ thực sự.
Jake T.

điều này gặp sự cố ngay lập tức
Daniel Springer

7

Có một lệnh menu sẽ gọi nó.

Hardware > Simulate Memory Warning từ trình mô phỏng.


8
Câu hỏi về mô phỏng trên thiết bị.
KPM

2
Trong Xcode 10, nó hiện nằm trong cảnh báo Gỡ lỗi> Mô phỏng bộ nhớ.
Sebbo

7

Đã chuyển đổi @ChikabuZ thành swift 3:

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

4

Nếu ai đó, vì bất kỳ lý do gì, cố gắng thực hiện điều này trong Swift 3 - đây là cách cấp 1,2 GB ram.

   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 (lặp lại: 100, đếm: 1200000000)
Adobels

2
@Adobels bạn nên đăng nó như một câu trả lời :)
Koen.

1

Swift 4:

UIApplication.shared.perform (Bộ chọn (("_ performanceMemoryWarning")))

Có thể thực hiện các điều trên để phản hồi một sự kiện / thông báo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.