Разница между 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 обращается к переменной экземпляра напрямую (т. е. он не проходит через метод получения, чтобы получить значение).

Дубликат

и, вероятно, около дюжины других, которые вы могли бы найти примерно за 15 секунд, воспользовавшись полем "Поиск" в правом верхнем углу сайта.

Другие вопросы по тегам