Разница между self.var и просто var
В чем разница между использованием self.var
против просто var
в классе Objective-C? Есть ли преимущества или опасности для одного или другого?
3 ответа
foo = self.var;
self.var = foo;
концептуально идентичен
foo = [self var];
[self setVar: foo];
Таким образом, используя точечную запись, вы действительно отправляете сообщения себе.
foo = var;
var = foo;
концептуально так же, как
foo = self->var;
self->var = foo;
Поэтому не использовать точечную нотацию для доступа к переменной экземпляра - это то же самое, что трактовать себя как указатель на структуру C и получать прямой доступ к полям структуры.
Почти во всех случаях предпочтительно использовать свойство (либо нотацию с точкой, либо нотацию отправки сообщения). Это потому, что свойство может быть сделано для автоматического выполнения необходимых сохранения / копирования / выпуска, чтобы остановить утечки памяти. Также вы можете использовать наблюдение значения ключа со свойством. Также подклассы могут переопределять свойства, чтобы обеспечить их собственную реализацию.
Два исключения для использования свойств - при установке ивара в init и при освобождении его в dealloc. Это потому, что вы почти наверняка хотите избежать случайного использования переопределения подкласса в этих методах, и вы не хотите запускать уведомления KVO.
self.var
называет собственность для var
, За кулисами Objective-C автоматически генерирует геттер для свойств (или вы можете сделать его самостоятельно, если хотите), поэтому self.var
использует этот геттер. гладкий var
обращается к переменной экземпляра напрямую (т. е. он не проходит через метод получения, чтобы получить значение).
Дубликат
- Как работает точечный синтаксис без явного @property в Objective-C?
- self.variable и переменная разница
- В чем разница между использованием методов доступа obj-c и использованием синтаксиса точек?
- iVars, с собой и без себя?
- Нужно ли "я"?
и, вероятно, около дюжины других, которые вы могли бы найти примерно за 15 секунд, воспользовавшись полем "Поиск" в правом верхнем углу сайта.