Приводите ли вы возвращенный объект к типу вашего объекта (MyObject
)?
Вы должны сделать что-то вроде:
((MyObject*)[mutableArray objectAtIndex:0]).age = 20;
Причина, по которой вы не получаете никаких ошибок, когдаиспользуя синтаксис [[mutableArray objectAtIndex:0] name]
, вы вызываете метод для возвращаемого объекта (который имеет тип id
), и id
s, как правило, не задыхаются во время компиляции, если вы вызываете (пока) неСуществующий метод на них.Во время выполнения [mutableArray objectAtIndex:0]
может разрешить для ввода MyObject
, и в этом случае сообщение [obj name]
имеет правильную реализацию (IMP
).Если он не преобразуется в MyObject
, ваше приложение будет аварийно завершать работу.
И обратите внимание, что причина, по которой вы даже не получаете предупреждение во время компиляции, состоит в том, что Xcode знает, что существует по крайней мере 1 класс вваша кодовая база, которая реализует метод name
, и доверяет вам вызов этого метода только для экземпляров этого класса.если вы сделаете что-то вроде ((MyObject*)[mutableArray objectAtIndex:0]).ageeeeee = 20;
, он выдаст вам предупреждение, так как есть очень высокая вероятность того, что он рухнет (ни один класс в вашем приложении не реализует метод ageeeeee
статически ).
Тип id
не имеет свойства name
, и поэтому вы не можете использовать точечный синтаксис.
На самом деле, этот инцидент прекрасно показывает, почему ObjC называют динамическим языком!