Почему свойства требуют явной типизации во время компиляции? - PullRequest
1 голос
/ 13 января 2011

Компиляция с использованием синтаксиса свойств требует, чтобы тип получателя был известен во время компиляции. Возможно, я чего-то не понимаю, но это похоже на сломанную или неполную реализацию компилятора, учитывая, что Objective-C - это динамический язык.

Свойство "комментарий" определяется с помощью:

@property (nonatomic, retain) NSString *comment;

и синтезируется с:

@synthesize comment;

«документ» является экземпляром одного из нескольких классов, которые соответствуют:

@protocol DocumentComment <NSObject>

@property (nonatomic, retain) NSString *comment;

@end

и просто объявлен как:

id document;

При использовании следующего синтаксиса свойства:

stringObject = document.comment;    

gcc генерирует следующую ошибку:

error: request for member 'comment' in something not a structure or union

Однако следующий эквивалентный синтаксис метода получателя компилируется без предупреждения или ошибки и работает нормально, как и ожидалось, во время выполнения:

stringObject = [document comment];  

Я не понимаю, почему свойства требуют, чтобы тип получателя был известен во время компиляции. Есть ли что-то, что мне не хватает? Я просто использую последний синтаксис, чтобы избежать ошибки в ситуациях, когда принимающий объект имеет динамический тип. Свойства кажутся недоделанными.

Ответы [ 2 ]

4 голосов
/ 13 января 2011

Компиляция доступа к свойству требует знания, как преобразовать имя свойства в правильное имя получателя / установщика. Не зная типа получателя, компилятор не может знать, как вызывается метод получения / установки, так как свойство могло переопределить имя как часть своего объявления, например:

@property (nonatomic, retain, getter=myComment) NSString *comment;

Если бы компилятор продолжал генерировать код для вашего нетипизированного примера, он сгенерировал бы [document comment], что приведет к сбою во время выполнения, поскольку правильный сгенерированный код на самом деле [document myComment].

3 голосов
/ 13 января 2011

Кевин прибил один из симптомов.

При проектировании свойств было принято очень конкретное решение , а не , чтобы поддержать id в качестве цели синтаксиса точки. Помимо двусмысленностей, на которые указывает Кевин, желание избегать всех двусмысленностей, связанных с (id) получателями, считалось желательным.

В целом, использование полностью неквалифицированного id нежелательно и активно не поощряется. При создании новых функций в языке не поддерживается id, что препятствует распространению хрупких шаблонов кодирования во всех новых функциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...