@Michal: пока объект находится в активном использовании (о чем свидетельствует счет сохранения> 1), его удаление из кэша не освобождает память. Поскольку существует вероятность повторного использования объекта, целесообразно придерживаться ссылки. Если объект удаляется из кэша, а затем повторно кэшируется до того, как предыдущий экземпляр будет выпущен тем, кто его держал, у вас будет избыточный экземпляр, плавающий вокруг.
очему я не использовалretainCount
На моих летних каникулах
Этот пост предназначен для получения подробной информации о причинах и причинах этого печально известного метода,retainCount
, для того, чтобы консолидировать соответствующую информацию, плавающую вокруг SO. *
Основы: Какие официальные причины не использоватьretainCount
? Есть ли когда-нибудь ситуациявообще когда это может быть полезно? Что нужно сделать вместо этого? ** Не стесняйтесь редактировать.
Историческая справка: почему Apple предоставляет этот метод вNSObject
протокол если он не предназначен для использования? Код Apple полагается наretainCount
для какой-то цели? Если так, то почему это не спрятано где-нибудь?
Для более глубокого понимания: каковы причины того, что объект может иметь другое количество сохранений, чем предполагалось бы из пользовательского кода? Можете ли вы привести примеры *** стандартных процедур, которые может использовать базовый код, которые вызывают такую разницу? Известны ли случаи, когда счет удержаниявсегда отличается от того, что может ожидать новый пользователь?
Все, что вы думаете, стоит упомянуть оretainCount
?
* Кодеры, которые плохо знакомы с Objective-C и Cocoa, часто сталкиваются или, по крайней мере, неправильно понимают схему подсчета ссылок. В объяснениях учебника может быть упомянуто сохранение количества, которое (согласно этим объяснениям) увеличивается на единицу, когда вы звонитеretain
, alloc
, copy
и т. д., и вниз на один, когда вы звонитеrelease
(и в какой-то момент в будущем, когда вы позвонитеautorelease
).
Таким образом, начинающий хакер Какао, Крис, может довольно легко прийти к мысли, что проверка счетчика сохранения объекта будет полезна для решения некоторых проблем с памятью, и, о чудо, есть метод, доступный для каждого объекта, который называетсяretainCount
! Крис звонитretainCount
на пару объектов, а этот слишком высокий, а тот слишком низкий, и что, черт возьми, происходит ?! Итак, Крис делает сообщение на SO: «Что не так с моим управлением памятью?» и затем рой <bold>, <большие> буквы опускаются, говоря: «Не делай этого! Ты не можешь положиться на результаты», что хорошо, но наш отважный кодировщик может захотеть более глубокого объяснения.
Я надеюсь, что это превратится в FAQ, страницу хороших информационных эссе / лекций от любого из наших экспертов, которые склонны написать один, на которые можно указать новые головы какао, когда они задаются вопросом оretainCount
.
** Я не хочу делать это слишком широким, но конкретные советы из опыта или документы по проверке / отладке сохраняют и выпускают пары могут быть уместными здесь.
*** в фиктивном коде; Очевидно, что широкая публика не имеет доступа к фактическому коду Apple.