Во время выполнения они делают то же самое, да, но вы все еще во время компиляции.
Во время компиляции, если вы используете точечную нотацию, компилятор не даст вам уйти с чем-то, что, по его мнению, может не работать. Поскольку вы обращаетесь к объекту через тип базового класса A
, а свойство относится к типу B
, компилятор выдает ошибку.
Если, с другой стороны, вы используете скобочные обозначения, компилятор менее категоричен и выдает только предупреждение. Он допускает, что вы могли бы знать, что делаете :-), но он дает вам знать, что он не видел метода с именем setB:
в интерфейсе класса A
.
Чтобы избавиться от предупреждения, объявите переменную lke вот так:
id pa;
Использование типа id
(что переводится как «указатель на объект») позволяет отправлять любое сообщение на объект без предупреждения, поскольку теперь компилятор не делает никаких предположений относительно типа объекта , Вы попали в удивительный мир полностью динамического языка Objective-C: -)