Разница между self.var и просто var - PullRequest
7 голосов
/ 07 января 2011

В чем разница между использованием self.var и просто var в классе Objective-C? Есть ли преимущества или опасности для одного или другого?

Ответы [ 3 ]

6 голосов
/ 07 января 2011

self.var вызывает свойство для var.За кулисами Objective-C автоматически генерирует геттер для свойств (или вы можете создать его самостоятельно, если хотите), поэтому self.var использует этот геттер.Обычный var напрямую обращается к переменной экземпляра (т. Е. Он не проходит через получатель, чтобы получить значение).

5 голосов
/ 07 января 2011
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.

0 голосов
/ 07 января 2011

Дубликат

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

...