Что такое утечки памяти и когда они гарантированно возникают?
Что проверяют
Знаете ли вы, что память в iOS считается ссылками через ARC, а не собирается сборщиком мусора. Слово «гарантированно» в вопросе не случайно: интервьюер ждёт конкретную конструкцию, которая течёт всегда, а не общие слова про профилирование.
Как отвечать
Утечка это объект, на который ещё есть сильные ссылки, но добраться до него уже некому. ARC освобождает объект, когда счётчик сильных ссылок падает до нуля, значит утечка это почти всегда цикл сильных ссылок.
Гарантированно течёт: два объекта, держащие друг друга сильно; убегающее замыкание, захватившее self, которое сам объект и хранит; таймер, у которого целью назначен тот же контроллер; наблюдатель NotificationCenter с блоком, токен которого не сняли; делегат, объявленный обычным свойством вместо weak var.
Разрыв цикла: [weak self] с проверкой на nil, unowned только там, где владелец заведомо переживает замыкание, слабая ссылка у делегата, invalidate() у таймера.
Диагностика: Memory Graph Debugger прямо показывает, кто держит объект; инструмент Leaks в Instruments ловит недостижимые циклы; печать в deinit это самая дешёвая проверка, что экран действительно закрылся.
Где спотыкаются
Рассказывают про сборщик мусора и недостижимые объекты. Ни в Swift, ни в Objective-C его нет, и после этого слова ответ звучит как пересказ статьи про другую платформу.
Ставят unowned там, где раньше писали weak, ради экономии проверки на nil. Разница видна только в падении: обращение к unowned после освобождения роняет приложение, слабая ссылка просто вернёт nil.
Считают утечкой любой рост памяти. Раздувшийся кеш картинок, копящийся массив и удержанный большой буфер достижимы, в списке циклов их не будет, и искать такое нужно по графу распределений.