iOS 단순학의 8 - 변수의 속성

1906 단어
제가 코드를 썼어요.
//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];
            };

좋은 웹페이지 즐겨찾기