Как добавление объекта в массив влияет на счетчик сильных ссылок (ARC)?

«Как добавление объекта в массив влияет на счетчик сильных ссылок (ARC)?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При добавлении объекта в массив (Array, NSArray) счетчик сильных ссылок (retain count) этого объекта увеличивается на 1, так как коллекция создает на него сильную ссылку.

Пример:

class MyObject {}

let obj = MyObject() // Сильная ссылка 1 (от переменной `obj`)
var array: [MyObject] = []
array.append(obj)    // Сильная ссылка 2 (от массива `array`)
// Общий retain count объекта = 2

Механизм и последствия:

  • Удержание в памяти: Объект гарантированно не будет деаллоцирован, пока находится в массиве.
  • Удаление из массива: При удалении объекта (например, array.removeFirst()) или при очистке всего массива (array = []), соответствующая сильная ссылка уничтожается, и retain count уменьшается.
  • Циклы сильных ссылок: Если объект сам содержит сильную ссылку на этот массив, может возникнуть retain cycle, приводящий к утечке памяти. Для его разрыва используют weak или unowned ссылки.

Важно: В Swift с ARC напрямую работать с retainCount не рекомендуется, но понимание этого принципа критично для управления памятью.