내가 이런 식으로 스택에 변수 크기의 배열을 할당하고, 가능 :alloca 함수와 오브젝티브 -c의 가비지 콜렉터
MaValue *myStack = alloca((sizeof(id) * someLength));
(나는이 작업을 수행 할 수있는 이유는 중요하지 않습니다 :) 그런 다음, 루프 내에서 myStack의/from 항목을 밀고 팝합니다. 스택에 밀어 붙이는 것들 중 일부는 다른 곳에서 참조되지 않은 새로운 객체입니다.
객관적인 C 가비지 수집기는 해당 포인터에 대해 알지 못하므로 새 (그렇지 않으면 참조되지 않은) 개체를 수집합니다. 그러한 믿음의 일부는 객관적인 C GC가 실제로 보수적이지는 않지만 (예를 들어 스택 맵을 통해) "그 포인터를 안다"는 생각에서 나온다.
그러나 모든 실험 ([NSGarbageCollector defaultCollector] collectExhaustively] 호출을 삽입 할 때)이 객체를 수집하지 못했습니다. 이는 훌륭하지만 예상치 못한 결과입니다. 그래서 GC가 전체 스택을 스캔하고 있으며, 예를 들어 보수적으로 실제 포인터 값이되는 정수가 있다고 가정합니다.
맞습니까? 또는 나는 무엇인가 놓치고 있냐?
'MaValue 'Objective-C 클래스 타입? 그렇다면 객체에 대한 포인터의 배열이기 때문에 포인터를 가리키는 포인터 인'MaValue ** myStack = ...'으로 선언해야합니다. 각 객체 인스턴스는 여전히 힙에 할당하면 GC가 메모리 관리를 대신 처리하며 스택에 Objective-C 객체 인스턴스를 가질 수없고 포인터 만 사용할 수 있습니다. –