Простой ответ: автоматически (при условии, что вы не отключили ARC)
Чуть более длинный ответ (при условии, что вы не отключили ARC):
Когда вы присваиваете значения свойств country
и dialCode
экземпляра CountryModel
, этот экземпляр будет иметь сильные ссылки на ссылочные значения NSString
.
Если вы присвоите новое значение любому из этих свойств, тогда предыдущая сильная ссылка будет отброшена и заменена сильной ссылкой на новое значение.
Когда экземпляр CountryModel
равенбольше не будет ссылаться на что-либо строго, тогда содержащиеся в нем сильные ссылки будут отбрасываться.
Когда отбрасывается сильная ссылка, если нет других сильных ссылок на ссылочный объект, этот объект становится пригодным для восстановления, и память, которую он занимает, возвращаетсяк доступному пулу памяти.
Примечание: если ссылка NSString
ссылается на буквенную строку, то сама буквенная строка бессмертна и никогда не будет возвращена.Если вы пытаетесь понять, когда освобождается память, отслеживая использование памяти, отслеживая dealloc
вызовы и т. Д. не не используют литеральные строки в качестве тестовых объектов - лучше всего использовать пользовательскийопределенный тип.
Но я отключил ARC ... Тогда память будет восстановлена, когда вы вручную дадите ей указание.Если вы получаете утечки , то включение ARC - ваш лучший выбор, если вы не можете этого сделать, вам нужно отладить!
HTH
Приложение послеcomment
Попытка проследить за подсчетом ссылок и ожидать, что они совпадут с реальным исполняемым кодом, не работает должным образом, поскольку в скомпилированном коде часто встречаются ссылки, о которых вы не знаете.По этой причине вы увидите, что многие авторы не одобряют отслеживание ссылок.
Вместо этого думайте с точки зрения сильных ссылок, делающих долю в собственности на объект, и пока есть владелец, объект выживает.
Может показаться, что это одно и то же, но есть небольшая разница в том, как они рассматриваются: счетчик ссылок принадлежит объекту ;в то время как ссылочный атрибут strong
, который утверждает долю владения, является частью принадлежности к ссылочной переменной .
В вашем примере комментария a
имеет долю владения в CountryModel
объект, на который он ссылается - единственная доля владения, созданная вами для этого объекта.Объект CountryModel
имеет доли владения в объектах, на которые ссылаются country
и dialcode
, но, возможно, не единственные такие заинтересованные стороны - в этом фрагменте мы не знаем, какие другие ссылочные переменные утверждают долю владения в этих объектах.ссылка на две переменные.
Позже, когда вы создаете temparray
ссылка на объект, хранящаяся в a
, копируется в массив и temparray
заявки и доля владения указанным объектом CountryModel
- в то время как a
продолжает отстаивать свою собственную долю собственности.Итак, теперь у вас есть две переменные, которые вы создали, утверждая долю владения в объекте CountryModel
.
Аналогичное объяснение применимо к b
& c
.
Когда нет владенияставка утверждается любой переменной / свойством над объектом, тогда этот объект может быть уничтожен.В рамках этого уничтожения любые переменные / свойства, которые являются частью этого объекта, уничтожаются, и любые доли владения, которые они утверждают, по ссылкам, хранящимся в них, отменяются.
Если в результате этого процесса больше объектов не имеют утвержденных долей владениянад ними тогда эти объекты тоже могут быть уничтожены;процесс продолжает уничтожать ненужные объекты до тех пор, пока единственными оставшимися объектами не станут те, в которых некоторая переменная / свойство заявляет о своей доле владения над ними.
HTH больше, чем смущает!