ARC 환경에서 dealloc 사용 오류

1877 단어 Ios개발하다

MRC 시대에 우리는 dealloc에서 많은 것을 해야 한다. 예를 들어 방출 대상, 현재 우리는 ARC 시대에 들어섰다. 일반 대상의 방출에 대해 시스템이 우리를 도와 주었다.우리는 더 이상 메모리 문제를 걱정할 필요가 없을까요?답안은 부정적이다.
하나.dealloc의 사용 a. 어떤 상황에서 호출될까요?대상의 인용 계수가 0이면 시스템은 dealloc 방법을 자동으로 호출하여 메모리를 회수합니다.
// 
-(void)dealloc{
   // [super dealloc];    //ARC 。   。
}

b. 호출 순서는 일반적으로 호출 순서는 하위 클래스의 대상이 풀렸을 때 상위 클래스가 가지고 있는 실례를 방출하는 것이다.이 점은 초기화 방법을 사용하는 것과 정반대다.
둘.dealloc 오류는 우리가 개발하는 과정에서 dealloc를 사용했지만 대상의 인용 계수가 0인지 아닌지를 의식하지 못했기 때문에 dealloc가 도대체 갔는지 안 갔는지 메모리가 폭증하고 이상한 문제에 부딪힐 수 있습니다.dealloc가 호출되지 않는 몇 가지 상황을 알아야 합니까?
  • controller에서 타이머 NSTimer를 사용한 후 폐기하지 않아 순환 인용
  • self.playerTimer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(playProgressAction)userInfo:nilrepeats:YES];
    
     
       [_playerTimerinvalidate]
        _playerTimer =nil;

    2. 프로토콜delegate는 weak 수식을 사용해야 합니다. 그렇지 않으면 순환 인용을 일으켜 메모리 @property(nonatomic, weak)iddelegate를 방출할 수 없습니다.
    3. Block에 사용하면 Block 리셋에서self를 직접 사용할 수 없습니다. 그렇지 않으면 순환 인용을 일으킬 수 있습니다.
     __weaktypeof(self) weakSelf =self;
        _audioStream.onCompletion=^(){
            [weakSelf nextButtonAction];
        };
    

    셋.제 사례에서 어제 저는 이상한 문제를 만났습니다. (NSNotification Center)로부터 통지를 받았습니다. 저는 분명히 통지를 한 번만 보냈는데 몇 번의 통지를 받았습니다. ViewController Pop이 돌아온 후에 다시push로 들어왔고 또 한 번의 통지를 받았습니다. 통지를 삭제하지 않았을 수도 있다는 것을 깨달았습니다. 제 방법:
    -(void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"delectOrGoDownProject" object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"changerInfoItem" object:nil];
    }

    틀림없다고 믿었는데, dealloc의 끊어진 지점에서 비로소 이 방법이 가지 않았다는 것을 발견했다. 왜?위의 방법에 따라 조사한 결과 자신이 delegate에서 사용한 것은 week이 아니라strong이라는 것을 발견했다.갑자기 내가 너무 멍청한 것 같아!
     
     
    자굴
    총괄: dealloc를 다시 사용할 때 이 방법이 호출되었는지 확인하는 것이 좋습니다!

    좋은 웹페이지 즐겨찾기