Прежде всего позвольте мне сказать, что я полностью ненавижу нотацию Objective-C. Он жертвует понятностью ради краткости, и это плохо. Фактически, два других ответа здесь показывают доказательство того, что вводит нотацию путаницы.
После того, как я пропустил разглагольствования, я сейчас попытаюсь ответить на вопрос.
Под капотом объекты Objective-C реализованы как указатели на структуры С. Вот почему
obj->ivar
иногда работает. Учитывая, что это структура C
(* OBJ) .ivar
также должен работать точно так же, как вы ожидаете от C. Сказав это, вы можете сделать ivars частными или защищенными, и в этом случае использование вышеприведенного вне области видимости, в которой они видны, приведет к ошибке компилятора.
Оператор точки при применении к объекту Objective-C (который является указателем, не забудьте) имеет совершенно другое значение. Это синтаксический сахар для отправки объекту сообщения доступа, означающего, что:
foo = obj.property;
obj.property = foo;
идентичен в действии
foo = [obj property];
[obj setProperty: foo];
Это все, что нужно для точечной записи. Если вы просматриваете свой код, заменяя все экземпляры первой формы на экземпляры второй формы, вы сделали все, что делает компилятор с точечной нотацией.
В частности
- вам не нужно декларировать
@property
для использования точечной нотации. Вы можете объявить методы доступа set и get традиционным способом как методы Objective C, хотя определенно рекомендуется использовать объявления @property
для вещей, которые являются логически свойствами.
- вам не нужна переменная резервного копирования. Нет причин, по которым ваши геттеры и сеттеры не могут вычислять значения.
Учитывая вышесказанное, основное различие между obj->ivar
и obj.ivar
состоит в том, что первый изменяет ivar напрямую, а второй вызывает метод доступа, это означает, что последний может выполнять любые необходимые операции по управлению памятью (сохраняет, освобождает, копирует и т.д.), а также может вызывать наблюдение значения ключа.