tgoop.com/mobileproglib/6036
Create:
Last Update:
Last Update:
Замыкания по умолчанию захватывают self. Если вы не используете [weak self], вы можете получить цикл удержания и утечку памяти.
class ProfileViewModel {
var onUpdate: (() -> Void)?
func setup() {
onUpdate = {
self.doSomething() // ⚠️ This captures self strongly
}
}
}
Исправление:
onUpdate = { [weak self] in
self?.doSomething()
}
Это очевидно, но все еще часто встречается это в коде:
let name: String? = getName()
print(name!) // Crashes if nil
Даже «безопасные» места могут подвести вас — например, повторное использование ячеек в
UITableView
.Вместо этого используйте
guard let
или if let
. Никогда не доверяйте данным слепо.Они кажутся удобными. Но они вызывают сбой, как и
!
, если не настроены правильно.var token: String!
print(token.count) // If token is nil, boom.
По умолчанию используется
?
. Используйте !
только в том случае, если вы абсолютно уверены, что он инициализирован перед использованием (например, инжектирован через сториборд).По умолчанию каждый класс в Swift может быть подклассом. Это может привести к снижению производительности из-за динамической диспетчеризации.
Используйте
final
, когда подклассы не нужны. Компилятор будет оптимизировать код лучше.final class UserManager {
// Now faster method calls, no subclassing allowed
}
Классическая ошибка в конфигурациях MVC или MVVM.
protocol MyDelegate: AnyObject {
func didUpdate()
}
class MyController {
var delegate: MyDelegate? // Should be weak
}
Всегда объявляйте свойства делегатов как weak, чтобы избежать циклов удержания:
weak var delegate: MyDelegate?
Какие ошибки чаще вам встречаются? Пишите в комментариях
#буст