본문 바로가기
개발 블로그/아이폰개발

[Objectvie-c 의 블록] objectvie c 블록[block] 2장 메모리 영역

by snapshot 2019. 11. 8.

"iOS와 OS X의 메모리 관리와 멀티스레딩 기법"에서는 블록은 Objectvice-C 객체라고 설명을 쭉~~해준다. 한번 읽어보시길..

두번 읽어 봤는데 사실 5번 더 읽어 봐야겠다..

 

객체이기 때문에 데이터 영역(_NSConcrete GlobalBlock), 스택(_NSConcreteStackBlock), 힙(_NSConcreteMallocBlock) 등 존재 할 수 잇다. 1장에서 우리가 쓴 형태는 _NSConcreteStackBlock 클래스 형태를 사용해서 스택 영역에 생겼다. 

 

스택영역..{}를 벗어나면 지역 변수 및 그 안에 있는 코드는 폐기된다..그런데..__block 변수와 블록은 스택에서 힙으로 복사(copy)를 하는 기능을 제공한다. 

 

이런식으로 힙으로 복사(copy)되어 폐기되지 않음

 

ARC 환경에서는 컴파일러가 자동으로 필요한 부분을 발견하고 블록을 스택에서 힙으로 복사를 한다. 

 

그런데 copy..이거 때문에 순환참조를 조심해야 한다.

_strong 속성의 객체형 자동 변수를 사용하는 블록이 스택에서 힘으로 복사될 때, 블록은 해당 객체의 소유권을 갖는다. 하지만 이 때문에 순환 참조가 발생할 수 있 다.

 

소유권과 순환참조를 알고 싶으면..

https://popopo.tistory.com/126

 

ARC, 순환참조와 소유권 지시어 (iOS, xcode)

ARC, 순환참조와 소유권 지시어 (iOS, xcode) "iOS와 OS 의 메모리 관리와 멀티스레딩 기법" 이란 오래된 책을 다시 요즘에 읽어 소유권 지시어에 대한 내용을 적어 본다. ARC (Automatic Reference counting)은..

popopo.tistory.com

 

객체의 기본은 strong 이기 때문에 블록 copy 될 때마다 count 1 씩 증가

 

ARC 환경에서는 블록 코드가 언제 카피되고 언제 사라지는 컴파일러가 알고 있기 때문에 가능 하다. 

 

순환 참조를 피하기 위해서는 __weak 속성으로 변수를 선언하고 그 변수에 self를 할당하면 된다.

 

 

참고 문헌

"iOS와 OS X의 메모리 관리와 멀티스레딩 기법"

 

댓글