Ответ
Преимущества:
- Ссылочная семантика: Объекты передаются по ссылке. Это эффективно для больших данных и удобно для моделирования сущностей с общим, изменяемым состоянием.
- Наследование: Позволяет создавать иерархии классов, переиспользуя и расширяя функциональность (single inheritance).
- Полиморфизм: Объекты могут использоваться через интерфейс их родительского класса или протокола.
- Жизненный цикл: Наличие деинициализатора (
deinit) для освобождения ресурсов. - Идентичность: Возможность проверки идентичности объектов с помощью оператора
===.
Недостатки:
- Риск цикла сильных ссылок (Retain Cycles): Требует аккуратного использования
weakиunownedссылок, особенно с замыканиями. - Сложность в многопоточности: Изменяемое состояние, доступное из нескольких потоков по ссылке, требует ручной синхронизации (мьютексы, семафоры).
- Налог на выделение памяти: Объекты создаются в куче (heap), что медленнее, чем размещение в стеке (stack).
- Отсутствие value-семантики по умолчанию: Изменение объекта по одной ссылке влияет на все другие ссылки.
Пример ссылочной семантики:
class User {
var name: String
init(name: String) { self.name = name }
}
let user1 = User(name: "Alice")
let user2 = user1 // Копируется ссылка, а не данные
user2.name = "Bob"
print(user1.name) // "Bob" - изменилось и у user1!