Почему вызов свойства по указателю NSObject приводит к ошибкам сборки? - PullRequest
0 голосов
/ 09 марта 2012

У меня есть NSMutableArray, который возвращает мне какой-то объект.У объекта, который я добавил, были свойства name, age.

Теперь, когда я использую эти свойства для возвращаемого объекта (obj.name или obj.age), Compiler говорит, что такого члена нет, используйте (->)вместо (.)

Я понимаю, что NSObject не будет иметь этих членов и, следовательно, не будет понимать свойство.

Но если я использую методы установки и методы получения как ((1012 * или[obj age]) Синтаксис вместо этих свойств, я не получаю никаких ошибок.

Но использование свойства означает вызов только метода установки или получения?
ad Цель С предполагает, что это динамический язык, верно?

Ответы [ 2 ]

3 голосов
/ 09 марта 2012

Приводите ли вы возвращенный объект к типу вашего объекта (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 называют динамическим языком!

1 голос
/ 09 марта 2012

Все верно - точечный синтаксис в этом случае не поддерживается.

Вам нужно привести указатель к фактическому классу:

((MyObject*)[array objectAtIndex: 0]).name = @"Bill";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...