Это может сбить голоса .... но обязательно спросите. , когда «deallocating» изменчивый словарь, вы вызываете removeAllObjects
, но можете ли вы просто установить его на nil
? Будет ли такой же результат? Как и при деаллоке массива, вы устанавливаете его на ноль. Могу ли я сделать это с измененным массивом вместо вызова removeAllObjects
?removeAllObjects и nil-ing NSMutableDictionary
ответ
Во-первых, игнорировать абсолютную retainCount
. Это бесполезно. См. (Печально ушедший веб-сайт здесь новый) http://sdarlington.github.io.
Во-вторых, словарь словаря не влияет на продолжительность жизни самого словаря (если только один из объектов словаря не содержит ссылки на словарь, создавая цикл сохранения).
Таким образом, removeAllObjects
полностью ортогонален длительности срока действия словаря (сохраняется ограничение цикла цикла).
Кроме того, когда все сильные ссылки (ARC) в словарь уничтожаются, словарь будет освобожден, и в этом процессе также будут выпущены все жесткие ссылки из словаря на содержащиеся в нем объекты.
т.е .:
NSDictionary *dict = [NSDictionary dictionaryWithObjectAndKey:@(1),@"one"];
NSDictionary *doct = dict;
dict = nil; // nothing happens
[something consumeDict:doct];
dict = nil;
На этом заключительном dict = nil;
, словарь может быть уничтожен. Или нет. Он не может быть немедленно уничтожен, потому что consumeDict:
вызвал сильную ссылку где-то или потому, что consumeDict:
называется retain
, а затем autorelease
, и словарь будет придерживаться до тех пор, пока бассейн не будет слит.
Говоря о бассейнах, иногда, [NSDictionary dictionary]
возвращает autoreleased объект. Итак, сидя в отладчике и проверяя, был ли освобожден словарь сразу после установки dict
на нуль (может быть, через ссылку __weak), будет жаль. Обратите внимание, что + словарь иногда может возвращать объект с автореализацией, или иногда он не зависит от уровня или версии оптимизации компилятора.
RemoveAllObjects не освобождает словарь. Он просто удаляет все ключевые значения из этого словаря. Вы можете установить новые значения ключа, не инициализируя его снова. Но установив его на ноль, вы должны снова инициализировать его, прежде чем вставлять новые значения.
Короткий ответ: да. Если вы удалите ссылку на словарь (независимо от того, изменена она или нет), а количество ссылок на объект словаря достигнет 0, словарь будет освобожден и, таким образом, высвободит все ссылки на ранее сохраненные объекты. Объекты массива также будут освобождены, если их счетчик ссылок достигнет нуля.
Все это происходит автоматически с помощью ARC, поэтому вам просто нужно беспокоиться о том, чтобы не ссылаться на объекты массива в вашем коде, чтобы удостовериться, что они освобождены.
NSMutableArray *arr = [NSMutableArray array]; //1 reference to the array
NSMutableArray *anotherReference = arr; //2 references to the array
arr = nil; //there is still 1 reference to the array, so it is not dealloced
anotherReference = nil; //no references left and the array is dealloced
Надежда, что помогает
Подождите, но в соответствии с user345095, даже если вы удалите все объекты массива, он не будет освобожден, если вы не установите его на ноль. Что мне не хватает – durazno
Я разработал свой ответ, чтобы показать, как работает функция keepCount :) Количество объектов в массиве не имеет никакого отношения к тому, когда оно будет отменено. –
Абсолютный счет сохранения бесполезен. Не думай об этом. Вы должны только беспокоиться о том, увеличиваете или уменьшаете счетчик удержания (или, в ARC, сохраняете ли вы сильную ссылку). Пример; * технически * значение удержания 'arr' может быть 2 после первой строки кода (в ARC). Может быть? Да; зависит от версии компилятора и уровня оптимизации. http://www.whentouseretaincount.com – bbum
Ссылка «whentouseretaincount dot com» - это какой-то вирус или троянец, командующий браузером, запрещающий его закрывать и пытающийся установить программное обеспечение на моем Mac. –
@LogicsaurusRex Спасибо. – bbum