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