iOS - ARC 환경에서 dealloc/didReceiveMemory Warning

2463 단어
Block은 그리 어렵지 않다(셋째): Block과 대상의 메모리 관리

1. iOS 개발 ARC에서 dealloc의 사용


ARC에서 시스템은 이 대상과 포함된 대상을 방출할 수 있습니다.그러나 이 대상에 속하지 않는 일부 물건을 방출할 수 없다. 예를 들어 다음과 같다.
  • 1.통지된 관찰자 또는 KVO의 관찰자
  • 2.대상의 강력한 의뢰/인용 해제(예를 들어 XMP Mannerger의delegate Queue)는 다른 대상에게 당신을 의뢰delegate로 간주할 때, 그리고 강력한 인용으로 간주할 때 즉시 당신 자신이 풀리지만, 당신의 대상을 인용하는 것은 여전히 존재합니다. 이때 당신의 대상을 인용할 때 이delegate
  • 를 제거해야 합니다.
  • 3.다른 로그아웃 같은 동작(프로그램이 실행되는 동안 닫히지 않은 자원)을 하는 대상. 예를 들어 ViewController가 제거하기 전에 서버와 접촉해야 할 수도 있다.이때 우리도 dealloc에 쓸 수 있다
  • dealloc의 밑바닥 구현에 관하여objc 실행 시 코드를 참조할 수 있습니다

    - (void)dealloc  
    {  
        [super dealloc];
        [[NSNotificationCenter defaultCenter] removeObserver:self];  //         
        [[XMPPManager sharedManager] removeFromDelegateQueue:self];  //        
        [[MyClass shareInstance]  doSomething ];  //      
    }  
    

    2. view Controller가 POP된 후에 dealloc를 호출하지 않는 문제

  • viewController가 POP된 후에 dealloc를 호출하지 않는 문제
  • controller는 방출할 수 없고 dealloc 방법을 사용하지 않는 4가지 가능성
  • 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

    좋은 웹페이지 즐겨찾기