2017-12-26 19 views
1

기본으로 NSCache을 설정했으며 서브 클래 싱 된 객체 인 NSObject을 저장하고 있습니다. 나는 (메모리 디버거로 확인) 그들에 대한 1 + 다른 강력한 참조가있을 때도 캐시에서 (이러한 애플 리케이션을 backgrounding 때) 이러한 개체를 공개 관찰하고 있어요. 내가 여기서 뭔가를 놓치고 있니? 내가 알고 있듯이, NSCache은 남아있는 참조가 없으면 메모리 압력 하에서 만 객체를 해제합니다.NSCache는 객체에 대한 강력한 참조가있을 때에도 객체를 해제합니까?

답변

0

NSCache가 소유권 그래프를 통해 추적을하지 않는 것을보고있는 것 같습니다. 은 실제로 메모리를 저장합니다. 자체 로컬 휴리스틱 스를 기반으로하는 릴리스입니다.

이 상황에서 NSCache를 사용하는 것에 대해 생각하는 것이 더 합리적 일 수 있습니다. 다른 강력한 참조가있는 경우 캐시 소유자가 객체 생성을 담당하지 않습니까? 캐시하려는 조회입니까?

개체 생성이 비싸지 만 언제든지 수행 할 수 있으며 개체 그래프에 영향을주지 않는 경우에만 NSCache를 사용했습니다.

+1

이것은 내가 발견 한 것 같습니다. 이것은 다른 사람들에게 기록을 남기는 훌륭한 답입니다! 필자의 경우 캐시 소유자 *는 개체 작성을 담당하지만 이러한 개체를 만드는 것은 메모리 비용뿐만 아니라 시간 비용도 발생시킵니다. 캐시를 치기 전에 현재 사용중인 객체에 대한 두 번째 참조를 유지함으로써 NSCache가 나를 위해 작동하도록하는 방법을 발견했습니다. – Warpling

+0

메모리 압박과 배경 인식 (backgrounding notifications)을 받았을 때 객체를 축출하여 구조와 같은 NSCache를 만드는 것이 사소한 것처럼 보이기 때문에 조금 이상합니다. 그러나 경험적 방법과 NSDiscardableContent 프로토콜을 사용하면 더 복잡한 경우 유용합니다. – Warpling

+0

네, 너무 많은 작업없이 맞춤 솔루션을 만드는 것이 가능합니다. 나는 아주 간단한 상황에서만 그것을 사용했습니다. 나는 너를 위해 일하는 것을 발견했기 때문에 다행이다! – Matt