Основное отличие состоит в том, что this
является ключевым словом, а self
является переменной. Результатом этого является то, что, хотя this
всегда относится к объекту, выполняющему определенный метод, методы Objective-C могут изменять self
во время выполнения. Это иногда используется конструкторами, которые устанавливают self = nil
при сбое.
Причины для этого:
- так, чтобы подклассы (которые инициализируют цепочку с
self = [super init]
) могли видеть, когда инициализация терпит неудачу, и знать, что они не продолжают в своих собственных инициализаторах.
- составляющие объекты могут видеть сбой и знать, что у них нет действительного компонента.
Некоторые инициализаторы установят self
на другой, но действительный объект. Это можно использовать в кластерах классов, где «абстрактный» класс может генерировать временный экземпляр при построении инициализированного объекта, но в конечном итоге вернуть другой объект на основе свойств, которые были созданы во время построения.
Кроме того, это означает, что вы можете делать обычные вещи с именами переменных, которые путают всех, что вы не можете сделать с ключевыми словами, такие как определение более локальной переменной с тем же именем self
в блоке кода.