То, что вы хотите - это слабая ссылка на ноль (это не «Грааль алгоритмов управления кэшем», это хорошо известный паттерн). Проблема в том, что Objective C обеспечивает обнуление слабых ссылок только при запуске с сборкой мусора, а не в программах, управляемых вручную. И iPhone не обеспечивает сборку мусора (пока).
Кажется, что все ответы пока указывают вам на половину решения.
Использование ссылки без переопределения недостаточно, потому что вам нужно будет обнулить ее (или удалить запись из словаря), когда указанный объект освобожден. Однако это должно быть сделано ДО того, как будет вызван метод -dealloc этого объекта, в противном случае само существование кэша подвергает вас риску воскрешения объекта. Способ сделать это - динамически создать подкласс объекта при создании слабой ссылки и в динамически созданном подклассе переопределить -release, чтобы использовать блокировку и -dealloc для обнуления слабых ссылок.
Это работает в целом, но с треском проваливается для бесплатных базовых объектов Core Foundation. К сожалению, единственное решение, если вам нужно распространить эту технику на бесплатные объекты с мостами, требует некоторого взлома и недокументированных вещей (см. здесь для кода и пояснений) и поэтому не может использоваться для iOS или программ, которые вы хотите продавать в Mac App Store.
Если вам нужно продавать в магазинах Apple и, следовательно, следует избегать недокументированных вещей, ваша лучшая альтернатива - реализовать заблокированный доступ к сохраняющемуся кешу, а затем очистить его для ссылок с текущим значением -retainCount, равным 1, когда вы хотите выпустить объем памяти. Пока все обращения к кешу осуществляются с удерживаемой блокировкой, если вы наблюдаете счет 1, удерживая блокировку, вы знаете, что никто не сможет воскресить объект, если вы удалите его из кеша (и, следовательно, освободите его ), прежде чем освободить замок.
Для iOS вы можете использовать UIApplicationDidReceiveMemoryWarningNotification, чтобы запустить очистку. На Mac вы должны реализовать свою собственную логику: может быть, просто периодическая проверка или даже просто периодическая очистка (оба решения также будут работать на iOS).