iOS 개발 : 장치에서 메모리 부족 경고를 유발하려면 어떻게해야합니까?


93

메모리 부족 상태에서 앱 기능을 잘 테스트하고 싶지만 테스트하기가 어렵습니다. 앱이 시뮬레이터가 아닌 디바이스에서 실행 중일 때 내 뷰에서 didReceiveMemoryWarning 메서드를 트리거하는 메모리 부족 경고를 유도하려면 어떻게해야합니까? 또는 이러한 가능한 조건에서 앱을 테스트 할 수있는 방법은 무엇입니까?

시뮬레이터를 사용할 수없는 이유는 내 앱이 Game Center를 사용하고 시뮬레이터에서 초대가 작동하지 않기 때문입니다.

답변:


9

장치에서 테스트하려면 메모리를 해제하지 않고 주기적으로 대량의 메모리를 할당하는 코드를 추가하면됩니다 (예 : 의도적으로 누출). 이 작업은 별도의 스레드에서 수행하거나 타이머에 대한 응답으로 수행하거나 애플리케이션의 동작을 테스트하고 관찰하는 데 가장 적합한 메커니즘을 사용할 수 있습니다.

이 앱을 쉽게 재사용하거나 여러 애플리케이션으로 테스트하려는 경우 유사한 작업을 수행하고 백그라운드에서 실행되도록 설계된 별도의 앱을 만들 수도 있습니다.


7
별로 실용적이지 않습니다. 테스트를 위해 개인 메서드를 호출하는 솔루션이 더 좋습니다
Daij-Djan

5
실제 시나리오를보고 싶다면 좋은 해결책이 아닙니다. 메모리 부족이 아닌 누수로 인해 앱이 손상됩니다. 당신이 원하는 것은 높은 메모리 압력 상태에서 앱이 어떻게 반응하는지 테스트하는 것이므로 좋지 않습니다. 단점은 문제가 실제 누출인지 또는 도입 한 가짜인지 파악하기가 더 어렵습니다. 개인 방법 1은 아래에 주어진 테스트에 더 좋습니다.
fzaziz 2014

2
두 번째 단락은 메모리가 실제로 부족할 때 앱의 동작을 테스트하려는 경우 실제로 Apple이하라는 내용이기 때문에이 답변을 비워서는 안됩니다.
매트

1
이 할당을 수행하는 코드 블록으로 답변이 향상됩니다!
pkamb

설정하는 데 더 많은 작업이 필요하지만 private 메서드를 호출하는 것보다 더 현실적인 테스트입니다. 심각한 메모리 부족이있을 때 앱이 명령 한 작업을 수행 할 수 있습니까? 그리고 그러한 행동이 상황을 완화하거나 악화시켜 iOS가 종료하게 만들까요? 게다가 DISPATCH_SOURCE_TYPE_MEMORYPRESSURE 테스트에는 private 메서드가 작동하지 않습니다.
jk7

278

private 메서드를 호출 할 수 있습니다 .

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

디버그에서만 사용하는 것을 잊지 마십시오. 그렇지 않으면 앱이 거부됩니다.


6
이 코드는 장치의 메모리 경고를 정확하게 시뮬레이션하는 것으로 보입니다. 감사합니다 엔조!
William Denniss 2012

28
코드에서 이것을 사용하는 대신 디버거에서 실행하십시오. 일시 중지를 누르고 입력하십시오po [[UIApplication sharedApplication]performSelector:@selector(_performMemoryWarning)]
orkoden 2014 년

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

29

iOS 시뮬레이터의 Simulate Memory Warning메뉴 항목을 사용하면 메모리 경고를 시뮬레이션 할 수 있습니다.


기기에서 확인하는 유일한 방법은 실제로 강제하는 것입니다. 즉, 앱을 장기간 사용하거나 집중적 인 이미지를 사용하거나 가지고있는 것이 앱마다 다릅니다. 경고를 더 빨리받을 수 있도록 iPhone 4 대신 구형 장치 (아마도 3g?)를 사용하는 것이 좋습니다.
Jesse Naugher 2011 년

고마워요, Jesse, 시뮬레이터에서 실행하고 그런 식으로 메모리 경고를 유도 할 수 있도록 초대를 시뮬레이션하기 위해 앱에 몇 가지 해킹을 추가 할 것 같습니다.
BeachRunnerFred 2011 년

10
기기의 시뮬레이션에 관한 질문입니다.
KPM

20

기기를 사용하여 메뉴 항목을 사용합니다. 기기-> 메모리 경고 시뮬레이션.

Xcode의 앱에서 Instruments를 사용하려면 제품-> 프로필 메뉴 항목을 사용하십시오.


이것은 더 좋습니다.
Zappel 2015-08-13

@OrangeDog 무슨 일이야?
ThomasW

2
글쎄, 아무것도. Enzo의 답변 뷰를 사용할 때이 방법을 사용하지 않고 돌아올 때 다시로드해야합니다.
OrangeDog

12

Swift에서 Enzo Tran의 답변 을 다시 작성 했습니다.

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

감사! Xcode는 "Objective-C 선택기로 선언 된 메서드가 없습니다"라고 경고하지만 그래도 작동합니다.
man1

10

어떤 이유로 든 누군가가 Swift 4에서 이것을 시도한다면 1.2GB의 램을 할당하는 방법이 있습니다.

let d = Data.init(repeating: 100, count: 1200000000)
  • 이는 다른 앱에서 경고 알림을 트리거하는 데 유용합니다.

이와 같은 작업을 수행하면 Instruments에서 보려는 실제 메모리 정보가 난독 화됩니까? 물리적 장치에서이 작업을 수행하는 적절한 방법이 없다는 것을 알지만 내 앱 내에서 내 메모리를 차지하는 것이 무엇인지 확인하는 것이 중요하다면 모든 데이터가 왜곡 될 것 같고 더 이상 상대적인 대답이 있습니다. 나는 여전히 무엇이 더 많이 차지하고 있는지 볼 수 있지만 실제 비율은 아닙니다.
Jake T.

이 즉시 충돌
Daniel Springer

8

@ChikabuZ를 신속한 3으로 변환했습니다.

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

7

그것을 호출하는 메뉴 명령이 있습니다.

Hardware > Simulate Memory Warning 시뮬레이터에서.


8
기기의 시뮬레이션에 관한 질문입니다.
KPM

2
Xcode 10에서는 이제 디버그> 메모리 시뮬레이션 경고 아래에 있습니다.
Sebbo

4

어떤 이유로 든 누군가가 Swift 3에서 이것을 시도한다면 1.2GB의 램을 할당하는 방법이 있습니다.

   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 (반복 : 100, 개수 :
1200000000

2
@Adobels는 답변으로 게시해야합니다
.

1

스위프트 4 :

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

이벤트 / 알림에 대한 응답으로 위를 실행할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.