или если Apple просто не любит все свойства.
Реальная причина в том, что большая часть структуры Фонда (давайте не будем забывать, что вы говорите о NS*
классов) стара как грязи - они были вокруг там с NeXT времен ... В то время, В языке Objective-C не было ключевого слова @property
- чтобы эмулировать свойства, программисты должны были объявлять и применять методы getter и setter вручную, это также применимо к коду Apple.
Теперь основа Фонда настолько фундаментальна, что она не сильно изменилась. Он не был радикально переписан и, насколько мне известно, программисты, которые его писали, не переписывали весь код с использованием нового синтаксиса. Вы можете видеть, что недавно добавленные классы фактически объявили свойства свойств, а не геттеры и сеттеры, но это не относится к старшим классам.
В любом случае свойства, объявленные вручную, и объявленные с использованием @property
и @synthesize
полностью эквивалентны. Тем не менее, есть очень небольшая разница при доступе к ним, но это не относится к декларации штуковина: если вы пишете
someObject.someProperty
в вашем коде, someObject
должен иметь полный и конкретный тип, так что если свойство с именем someProperty
несуществует, вы получите ошибку компилятора.В отличие от этого,
[someObject someProperty]
и
[someObject setSomeProperty:]
позволяют вам вызов метода, даже если это необъявленная.
Edit:
я спрашиваю, что смысловая разница между ними
Итак, «семантического различия», вы имели в виду «когда оно должно быть использовано», а не «делает это работать по-другому ". Понимаю. Ну ... Концептуально свойства представляют состояние. Свойство является особой характеристикой объекта, который может меняться со временем. Это просто несвязанный факт, что доступ к свойствам осуществляется с помощью методов доступа в Objecive-C.
Если вы пишете метод, действующий на obejct (кроме установки свойства, конечно), есть справедливая вероятность, что вы должны объявить и назвать его как метод. Если вы получаете доступ (чтение или запись) атрибута объекта, который лучше соответствует задаче свойства.
Свойства ** являются ** сеттерами и геттерами. Нет никакой реальной разницы. – 2013-03-09 18:36:19
Я поставил свой вопрос яснее. – fumoboy007
Многие API-интерфейсы Apple предшествовали внедрению свойств. Какао было около 6 лет (и NextStep, на котором он основан, за несколько лет до этого) до того, как объявленная функциональность свойств была добавлена в ObjC. –