iOS 단순학의 8 - 변수의 속성
//Todo. maybe retain cycle.
self.movieWriter.newFrameCallback = ^{
[self.delegate appendFrame:self error:nil curduration:self.movieWriter.duration];
};
이 코드는 retain cycle을 표시합니다.
이거부터 retain cycle.
Retain cycle, 중국어로 번역하면 대충 보존 고리라고 하죠.기왕 부모 대상이 자식 대상을 가지고 있고 자식 대상은 부모 대상이 방출됨에 따라 방출된다. 만약에 두 대상이 서로 부모 대상이 된다면 어떻게 하겠는가?
예를 들어 A와 B 두 대상, A는 B를 가지고 있고 B는 동시에 A를 가지고 있다. 위의 규칙에 따르면 A는 B가 석방된 후에만 석방될 수 있다. 마찬가지로 B는 A가 석방된 후에만 석방될 수 있다. 쌍방이 모두 상대방의 석방을 기다리고 있을 때 Retain cycle은 형성된다. 결과적으로 두 대상은 영원히 석방되지 않고 최종적으로 메모리가 유출된다.
메모리 관리 원칙을 조사하다.
1. 기본strong, weak을 선택할 수 있습니다.strong 아래에서 구성원 변수나property를 막론하고 매번 포인터를 사용하여 대상을 가리키는 것은 자동으로retain () 을 호출하고, 옛 대상을release () 를 호출하기 때문에nil은release로 설정합니다.2. 어떤 대상이 strong 바늘에 가리키면 소각되지 않습니다. 그렇지 않으면 바로 풀려납니다.runloop이 끝날 때까지 기다릴 필요가 없습니다.모든strong 포인터 변수는 dealloc에서 수동으로 nil로 설정할 필요가 없습니다. iOS는 자동으로 처리되고 debug는 모두 nil로 설정된 것을 볼 수 있습니다. 가장 먼저 설명한 변수는 dealloc로 호출됩니다.
3. 공식적인 제안 IBOutlet +weak, 실제로는 넣지 않아도 자동으로 방출됩니다.
4. 개인 구성원 변수를 우선적으로 사용하고 속성을 공개해야 property를 사용하지 않는다.
5, 순환 인용을 피하고 그렇지 않으면 수동으로nil 방출을 설정합니다.
6. Block 방법은 자주 설명합니다: @property(copy)void(^MyBlock)(void);현재 역할 영역을 초과한 후에도 Block을 계속 사용한다면, 코피 키워드를 사용하여 덤프 구역으로 복사해서 덤프 구역의 변수가 소각되지 않도록 하는 것이 좋습니다.
7. Block 익명 함수를 만들기 전에 self를 weak화해야 합니다. 그렇지 않으면 순환 인용이 controller를 방출할 수 없습니다.
__weak My Controller*weakSelf = self 또는weak __typeof(self) weakSelf = self; Block 메서드를 실행할 때도 강력한 참조로 변환한 후 사용할 수 있습니다.
MyController* strongSelf = weakSelf;
if (!strongSelf) { return; }
그래서 이렇게 써야 Waring이 없고 메모리 유출이 일어나지 않는다.
__weak typeof(self) weakSelf = self;
self.movieWriter.newFrameCallback = ^{
[weakSelf.delegate appendFrame:weakSelf error:nil curduration:weakSelf.movieWriter.duration];
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.