2009-05-07 1 views
0

Это может быть очень глупо начинающий вопрос, НО:В каких случаях рекомендуется отказаться от использования self при доступе к переменным экземпляра?

Если у вас есть некоторые интересные переменные экземпляра в классе, такие как UIScrollView * scrollView2, например, почему вы должны обойти геттер и сеттер, отказавшись в

[self.scrollView2 addSubview:imageView]; 

, а скорее делает

[scrollView2 addSubview:imageView]; 

? Я имею в виду ... перебирать геттер не повредит, и на самом деле я думал, что это всегда путь. Но во всех примерах Apple я пропустил эту схему повсюду. Они редко используют self.someInstanceVariable при вызове методов. Или у меня что-то не так?

Я начал делать то же самое, что и яблоко, но я хотел бы знать: почему?

ответ

2

Я тоже обходил геттер/сеттер, пока не понял, что привязки не работают при прямом доступе к переменной. Другими словами, кодирование с ключом действует только при доступе к свойству с функциями getter/setter.

EDIT: см. this page для соответствия требованиям KVC.

3

Имеет отношение к KVO (Key-Value Observing) и KVC (Key-Value Coding). Если вы обходите геттер или сеттер, объекты, которые смотрят значение, не получат сообщение.

+0

хорошо, поэтому в этих случаях Apple просто хотела удостовериться, что никто другой не получит уведомление или что-то еще, если они используют переменную экземпляра? Как обо всех материалах управления памятью, которые делают аксессоры? – Thanks

+0

Swanzus Longus: Одна из возможных причин заключается в том, что ничего не наблюдалось в этом свойстве, поэтому это не имело особого значения и было немного быстрее без сообщения о доступе (неверная причина - всегда использовать сообщение о доступе в любой публичной собственности, на случай, если вы начнете наблюдать это в будущем). Другая возможная причина заключается в том, что она не является публичным свойством объекта: это всего лишь ивар, не более того. –

+0

Спасибо, Питер. Так что справедливо сказать: «Если у вас есть общественная собственность, никогда не обходите аксессоров»? Я имею в виду ... для меня нет смысла обойти их. Этот один маленький вызов для доступа не должен задерживать так много ... За исключением среды, в которой какой-то цикл атакует переменную экземпляра 1000 раз в секунду. – Thanks

1

Как правило, вы не использовали бы свойства в init или dealloc, лучше получить доступ к переменным экземпляра непосредственно, так как ваш объект может находиться не в «безопасном» состоянии.

+0

Я предполагаю, что вы имеете в виду использование аксессуаров, верно? – Thanks

+0

Справа. Свойства, вероятно, были неправильным словом, это же верно, если вы написали свои собственные методы доступа, не объявив это свойством. –

Смежные вопросы