2013-03-09 3 views
1

Мне просто интересно о семантике. Когда что-то действительно «свойство» объекта? Я заметил во многих API-интерфейсах Apple, они явно определяют геттеры и сеттеры вместо использования свойств (например, URL и setURL на NSURLRequest/NSMutableURLRequest, верно, что URL-адрес кажется «свойством» запроса URL-адреса, верно?) Мне интересно если есть какая-то тонкая вещь, которую я пропущу, или если Apple просто не любит все свойства. = PКогда использовать свойства против уловщиков и сеттеров

ОБНОВЛЕНИЕ: Начиная с iOS 8, Apple превратила большинство (если не всех) своих не-имущественных геттеров и сеттеров в свойства. (Возможно, сделано так, что Swift совместимость будет проще.)

+2

Свойства ** являются ** сеттерами и геттерами. Нет никакой реальной разницы. – 2013-03-09 18:36:19

+0

Я поставил свой вопрос яснее. – fumoboy007

+4

Многие API-интерфейсы Apple предшествовали внедрению свойств. Какао было около 6 лет (и NextStep, на котором он основан, за несколько лет до этого) до того, как объявленная функциональность свойств была добавлена ​​в ObjC. –

ответ

8

или если Apple просто не любит все свойства.

Реальная причина в том, что большая часть структуры Фонда (давайте не будем забывать, что вы говорите о NS* классов) стара как грязи - они были вокруг там с NeXT времен ... В то время, В языке Objective-C не было ключевого слова @property - чтобы эмулировать свойства, программисты должны были объявлять и применять методы getter и setter вручную, это также применимо к коду Apple.

Теперь основа Фонда настолько фундаментальна, что она не сильно изменилась. Он не был радикально переписан и, насколько мне известно, программисты, которые его писали, не переписывали весь код с использованием нового синтаксиса. Вы можете видеть, что недавно добавленные классы фактически объявили свойства свойств, а не геттеры и сеттеры, но это не относится к старшим классам.

В любом случае свойства, объявленные вручную, и объявленные с использованием @property и @synthesize полностью эквивалентны. Тем не менее, есть очень небольшая разница при доступе к ним, но это не относится к декларации штуковина: если вы пишете

someObject.someProperty 

в вашем коде, someObject должен иметь полный и конкретный тип, так что если свойство с именем someProperty несуществует, вы получите ошибку компилятора.В отличие от этого,

[someObject someProperty] 

и

[someObject setSomeProperty:] 

позволяют вам вызов метода, даже если это необъявленная.

Edit:

я спрашиваю, что смысловая разница между ними

Итак, «семантического различия», вы имели в виду «когда оно должно быть использовано», а не «делает это работать по-другому ". Понимаю. Ну ... Концептуально свойства представляют состояние. Свойство является особой характеристикой объекта, который может меняться со временем. Это просто несвязанный факт, что доступ к свойствам осуществляется с помощью методов доступа в Objecive-C.

Если вы пишете метод, действующий на obejct (кроме установки свойства, конечно), есть справедливая вероятность, что вы должны объявить и назвать его как метод. Если вы получаете доступ (чтение или запись) атрибута объекта, который лучше соответствует задаче свойства.

+0

Смотрите мой комментарий к JoshCaswell выше.Кроме того, я уже знаю, что вы можете использовать свойства и простые получатели и сеттеры точно так же; однако я спрашиваю, что такое семантическая разница между ними. – fumoboy007

+0

@ fumoboy007 См. Первое предложение 3-го абзаца ...>. < – 2013-03-09 18:55:13

+0

@ fumoboy007 Действительно ли нужно, чтобы уменьшить мой ответ, потому что вы не смогли его прочитать? – 2013-03-09 18:55:39

1

Имея геттер и сеттер позволяет использовать сообщения доступ к элементу

[myObject someProperty] или [myObject setSomeProperty: someNewValue]

Создание что-то @property дает вам дополнительно способность используйте точечную нотацию для вызова получателя и сеттера. Это связано с тем, что @property выбирает имена методов, которые делают класс-значение-кодирование класса совместимым для конкретного значения.

myObject.someProperty или myObject.someProperty = someNewValue

Хотя можно сделать это вручную, считается лучшей практикой использовать @property, когда вы хотите использовать точечную нотацию. Со временем закулисные бахавы @property и @synthesize сильно изменились, особенно в отношении автоматического создания хранилища для соответствующего указателя. Использование @property упрощает работу с изменениями Apple в соглашении с небольшим или никаким изменением кода.

Дополнительно, используя @property, ваш код намного легче читать.

+3

Это неверно. Изначальная нотация и запись в скобках работают независимо от того, был ли метод объявлен с использованием свойства или нет. 'myString.integerValue;' отлично действует, как и '[myUIViewController setEditing: YES];' –

+1

Технически можно использовать точечную нотацию для вызова метода, который не имеет параметров. Однако это не считается лучшей практикой. Кроме того, точечное обозначение не будет работать для установщика, если не используется значение @property. –

+3

Да, это, безусловно, будет, пока сеттер следует правильному правилу именования: https://gist.github.com/anonymous/27e15b25ac8996056d27 Однако точка зрения на лучшую практику верна и, вероятно, будет хорошей вещью поднимитесь, отвечая на этот вопрос. –

Смежные вопросы