iOS - ARC 환경에서 dealloc/didReceiveMemory Warning
1. iOS 개발 ARC에서 dealloc의 사용
ARC에서 시스템은 이 대상과 포함된 대상을 방출할 수 있습니다.그러나 이 대상에 속하지 않는 일부 물건을 방출할 수 없다. 예를 들어 다음과 같다.
dealloc의 밑바닥 구현에 관하여objc 실행 시 코드를 참조할 수 있습니다
- (void)dealloc
{
[super dealloc];
[[NSNotificationCenter defaultCenter] removeObserver:self]; //
[[XMPPManager sharedManager] removeFromDelegateQueue:self]; //
[[MyClass shareInstance] doSomething ]; //
}
2. view Controller가 POP된 후에 dealloc를 호출하지 않는 문제
1.1 컨트롤러에서 NSTimer가 제거되지 않음
view Controller에 NSTimer가 있을 때, 호출할 때 특히 주의해야 한다
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]
시
target:self
, 즉 현재viewController
를 인용하여 viewController
의 인용 계수를 1로 증가시켰기 때문에 이NSTimer
를 소각하지 않으면 이viewController
를 계속 보류하고 방출할 수 없으며 dealloc
방법을 사용하지 않을 것이다.따라서 viewWillDisappear
이전에 컨트롤러를 사용해야 하는 NSTimer
를 폐기해야 한다.[timer invalidate]; // timer
timer = nil; // nil
1.2viewController의 delegate는 weak 속성이 아닙니다.
예를 들어
@property (nonatomic, weak) id delegate;
에이전트는 약한 인용을 사용해야 한다. 사용자 정의 컨트롤은 보기 컨트롤러에 불러오기 때문에 보기 컨트롤러view는 사용자 정의 컨트롤
이고 에이전트 속성이 strong
로 설정되면 delegate
보기 컨트롤러도
하고 순환 인용을 할 수 있음을 의미한다.컨트롤러가 풀리지 않아 메모리가 유출되었다.1.3viewController에서 Block의 순환 참조
ARC 아래에서 Block은 현재 컨트롤러 self를 포함한 모든 대상을 강제로 인용하기 때문에 순환 인용 문제가 발생할 수 있습니다.예를 들어
viewController
에는 개block
의 속성이 있고 block
에서self나 다른 구성원 변수를 강제로 인용하면 이viewController
와 자신block
의 속성은 순환 인용을 형성하여 viewController
를 방출할 수 없다.3. didReceiveMemoryWarning
http://blog.csdn.net/wangyanchang21/article/details/50730902
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.