OC 블록 반복 참조(Retain Cycle)로 인한 메모리 유출을 기록합니다.
CameraCapturer
가 있어 메모리 유출 코드를 만들었다.[_rawDataOutput setI420FrameAvailableBlock:^(const GLubyte *outputBytes, uint8_t *bytes_y, int stride_y, uint8_t *bytes_u, int stride_u, uint8_t *bytes_v, int stride_v, NSInteger width, int height) {
......
......
......
if(_owner) {
_owner->IncomingI420VideoFrame(&videoFrame, 0);
}
}];
_owner
는 클래스 구성원 변수로 OC의 block
블록에서 인용된다. 이때CameraCapturer
대상의 인용계수기는 +1
된다. 이 클래스가 방출될 때 위의 block
를 먼저 방출해야 하고block
의 방출은 CameraCapturer
대상의 방출에 의존해야 한다. 이로 인해 순환 인용(Retain Cycle), 최종적CameraCapturer
대상의 인용계수기는 0을 설정할 수 없다- dealloc
.메모리 유출을 초래하다.해결 방법:self
를 weak
약인용으로 바꾸고 block
에서 self
약인용을 strong
강용으로 전환한 다음에 _owner
구성원 변수를 사용하면 된다. 코드는 다음과 같다.__weak typeof(self)weakSelf = self;
[_rawDataOutput setI420FrameAvailableBlock:^(const GLubyte *outputBytes, uint8_t *bytes_y, int stride_y, uint8_t *bytes_u, int stride_u, uint8_t *bytes_v, int stride_v, NSInteger width, int height) {
......
......
......
__strong typeof(weakSelf) strongSelf = weakSelf;
if(strongSelf->_owner) {
strongSelf->_owner->IncomingI420VideoFrame(&videoFrame, 0);
}
}];
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.