Я объявил объект Array, например:
let data = ["foo", "bar"]
Тип массива в swift – это тип значения, где он хранится? кучу или стек?
Я думаю, он хранится в куче, но как получить к нему доступ?
И соответствует ли это правилу ARC, когда оно будет выпущено?
Можете ли вы дать мне графику памяти объекта?
В Swift или другом языке по умолчанию тип значения хранится в Stack, а ссылочный тип хранится в куче.
Если значение является частью ссылочного типа, то оно хранится в куче.
Поэтому нам не нужен подсчет ссылок, и значение будет чистым после окончания его объема, или, в другом случае, когда контейнер будет выпущен.
В вашем примере: данные экземпляра Array
будут храниться в стеке приложения, в то время как его элементы могут быть сохранены в куче, в зависимости от элемента используется ссылочный тип или значение.
Учитывая пустой массив:
let data = Array<Any>()
Тип массива в swift – это тип значения, где он хранится? кучу или стек?
Это постоянный пустой массив, поэтому он нигде не хранится. Буквально нигде. Если в нем были какие-то элементы, ящики для них будут храниться в стеке. Содержимое этих ящиков может храниться в стеке или в куче в зависимости от размера. Если бы у него было больше элементов, ящики также были бы сохранены в куче.
И соответствует ли это правилу ARC, когда оно будет выпущено?
Типы значений уничтожаются, когда их референт выходит за рамки, поэтому всякий раз, когда data
покидают область действия. ARC здесь не имеет отношения. Тем не менее, если есть другая ссылка на резервное хранилище (heap), то это хранилище не может быть уничтожено до тех пор, пока ARC не будет полностью релевантным (но полностью внутренним, поэтому не связано с data
).
Можете ли вы дать мне графику памяти объекта?
В приведенном случае графикой памяти объекта является:
Это. Нет памяти. Но если вы поместите вещи в это, то это будет дико зависеть от того, что вы положили в него.
Я знаю, что я невероятно легкомыслен. Это специально. Ответ “зависит от этого, а также, в большинстве случаев, вам все равно, и во всех случаях это внутренняя деталь реализации, которая не обещана и может измениться с момента выпуска до выпуска”.
Время, когда вы заботитесь, – это когда есть проблема с производительностью, а затем вам очень много. К сожалению, Свифт почти не дает никаких обещаний. Тем не менее, у нас очень много информации из команды Swift. Лучший ресурс – это понимание Swift Performance от WWDC 2016, которое объясняет макет внутренней памяти. Скорее всего, это не так, как вы ожидаете, и это невероятно зависит от специфики массива. Учитывая массив, о котором вы спросили, ответ “нигде, он пуст”.