В чем разница между управлением памятью в Objective-C и Swift?

«В чем разница между управлением памятью в Objective-C и Swift?» — вопрос из категории Управление памятью, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Objective-C исторически использовал ручное управление памятью (MRC), где программист вызывал retain, release, autorelease. Позже был введен Automatic Reference Counting (ARC), который автоматически вставляет эти вызовы, но все еще основан на подсчете ссылок для объектов (reference types).

Swift использует более современный и оптимизированный ARC, который эффективно работает как с reference-типами (классы), так и с value-типами (структуры, перечисления). Swift предоставляет более безопасные и четкие механизмы для предотвращения циклов сильных ссылок.

Ключевые отличия:

  1. Оптимизация: Swift ARC более агрессивно оптимизирован компилятором (например, может размещать объекты в стеке).
  2. Value types: В Swift ARC управляет памятью для value-типов, которые используют механизм Copy-on-Write.
  3. Безопасность ссылок: Swift предоставляет weak (опциональная слабая ссылка) и unowned (неопциональная, но с гарантией существования объекта). В Objective-C есть __weak и менее безопасный __unsafe_unretained.
  4. Мост в C: Objective-C часто требует явного использования квалификаторов, таких как __bridge, __autoreleasing.

Пример weak-ссылки:

// Swift
class Person {
    weak var apartment: Apartment?
}
// Objective-C
@interface Person : NSObject
@property (weak) Apartment *apartment;
@end