-
[iOS] Block을 사용할 때 주의해야할 점 : 순환참조(RetainCycle)로 인한 Memory Leak앱등이에게 살충제를 뿌린다./iOS 2016. 1. 17. 19:28
Block은 캡쳐링을 통해 Context의 걊을 전달하는 기능을 갖고 있습니다. 캡쳐링이 가능하기 때문에 장점을 가지기도 하지만 구멍또한 존재합니다.
1. 문제 발생
예제를 통해서 보겠습니다.
1. ViewController 객체 내부에서 model이란 객체를 strong으로 갖고 있구요.
2. model에서 ViewController를 참조하게 되는 블락을 전달하려고 합니다.
Capturing 'self' strongly in this block is likely to lead to a retain cycle. : block에서 self를 강하게 참조하고 있기 때문에 순환참조 발생 가능성이 있습니다.라고 하고있네요.
네. model 객체에서 viewcontroller객체를 강하게 참조하고 있고 viewcontroller객체도 당연히 model 객체를 강하게 참조하고 있기 때문입니다. 강한참조로 서로를 참조하고 있으니 retain cycle이 발생하는건 당연하구요.
2. 문제 해결
그렇다면 어떻게 해결할 수 있을까요? 전후관계를 파악하여 둘중 하나가 약한참조 변수가 되어야겠네요.
model객체가 viewcontroller객체를 약한참조로 참조하는것이 맞는 것 같습니다. 수정해보도록 하겠습니다.
밑줄 친부분이 추가되었습니다. self를 참조하는 weak타입 참조변수를 하나 더 만들어서 순환참조를 방지했습니다. delegate를 선언할 때 weak으로 선언하는 것과 같은 원리입니다.
3.코드 보완
하지만 언제 어디서 weak 인스턴스가 nil로 변할지 모릅니다. 따라서 저희는 캡쳐링은 weak으로 하되 블럭 내부에서는 strong하게 참조를 하여 사용하기를 원합니다.
내부에서 강한참조를 한 뒤에 nil테스트를 하여 객체가 존재할 경우 블럭이 실행되도록 바꿔주었습니다.
끝.
참조 : http://tvcast.naver.com/apped/playlists
'앱등이에게 살충제를 뿌린다. > iOS' 카테고리의 다른 글
[NSHipster - iOS] Enumeration,Iteration,Traverse.. 반복문의 퍼포먼스에 대해 알아보자 (0) 2016.01.22 [iOS] Objective-C로 하는 비동기 처리 (0) 2016.01.20 [iOS] Block의 캡쳐링과 __block (0) 2016.01.17 Target-Action (0) 2016.01.10 responder object (0) 2016.01.10