블록에 관해 자주 묻는 질문입니다
으아아아ARC가 없으면 블록은 exampleB_addBlockToArray(...)의 스택에 할당된 NSStackBlock입니다. exampleB()에서 실행될 때 해당 스택이 지워졌기 때문에 블록은 더 이상 유효하지 않습니다.
설명은 원리만 설명합니다. 이해는 되지만 잘 모르겠죠?
NSStackBlock은 힙의 로컬 객체 변수와 달리 스택 "객체"와 유사합니다. 반환 후에는 가리키는 콘텐츠가 해제되지 않습니다. 그럼 함수가 끝난 후에도 배열에 저장된 객체(점)는 여전히 존재하지만, 가리키는 메모리(내용)는 해제된다는 건가요?
滿天的星座2017-05-02 09:21:15
ARC가 아닌 상황에 대해서는 잘 모르겠지만, 저도 님과 같은 생각이라 답변해 보세요~
설명에 따르면 ARC가 아닌 블록은 힙이 아닌 스택에 배치되는데 이는 기본 유형과 동일합니다. exampleB_addBlockToArray
의 블록 정의는 int b = 1;
입니다. 배열에 저장되는 것은 &b
과 같은 주소인 b에 대한 포인터입니다. 0x1234567……
이 함수의 지역 변수입니다. 따라서 이 함수가 끝나면 사용된 메모리가 "해제됩니다". 실제로는 "데이터가 삭제되었으며 이 메모리를 사용할 수 있습니다"라고 표시됩니다. exampleB_addBlockToArray
포인터는 여전히 존재하지만 포인터가 가리키는 메모리는 더 이상 이 포인터의 제어를 받지 않습니다. 다른 데이터가 이미 기록되어 있을 수도 있고, 방금 전까지의 데이터가 아직 남아 있을 수도 있습니다. 0x1234567……