ARC 환경에서 dealloc 사용 오류
MRC 시대에 우리는 dealloc에서 많은 것을 해야 한다. 예를 들어 방출 대상, 현재 우리는 ARC 시대에 들어섰다. 일반 대상의 방출에 대해 시스템이 우리를 도와 주었다.우리는 더 이상 메모리 문제를 걱정할 필요가 없을까요?답안은 부정적이다.
하나.dealloc의 사용 a. 어떤 상황에서 호출될까요?대상의 인용 계수가 0이면 시스템은 dealloc 방법을 자동으로 호출하여 메모리를 회수합니다.
//
-(void)dealloc{
// [super dealloc]; //ARC 。 。
}
b. 호출 순서는 일반적으로 호출 순서는 하위 클래스의 대상이 풀렸을 때 상위 클래스가 가지고 있는 실례를 방출하는 것이다.이 점은 초기화 방법을 사용하는 것과 정반대다.
둘.dealloc 오류는 우리가 개발하는 과정에서 dealloc를 사용했지만 대상의 인용 계수가 0인지 아닌지를 의식하지 못했기 때문에 dealloc가 도대체 갔는지 안 갔는지 메모리가 폭증하고 이상한 문제에 부딪힐 수 있습니다.dealloc가 호출되지 않는 몇 가지 상황을 알아야 합니까?
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를 다시 사용할 때 이 방법이 호출되었는지 확인하는 것이 좋습니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ARC 환경에서 dealloc 사용 오류MRC 시대에 우리는 dealloc에서 많은 것을 해야 한다. 일반 대상의 방출에 대해 시스템이 우리를 도와 주었다.우리는 더 이상 메모리 문제를 걱정할 필요가 없을까요?답안은 부정적이다. 어떤 상황에서 호출될까요?...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.