Как я могу избежать избыточности при объявлении новых атрибутов класса в Objective-C? - PullRequest
3 голосов
/ 16 ноября 2010

В моем коде каждый раз, когда мне нужен новый атрибут объекта для моего класса, я обычно копирую / вставляю его имя в 4 разных местах!

  • Объявление в файле заголовка (NSObject * myObject;)
  • Строка @property()
  • Строка @synthesize() в реализации
  • Выпуск ее в dealloc: (только для объектов курса)

Я делаю это потому, что это работает, а не потому, что я полностью понимаю, что происходит.Я знаю, что объявление в заголовочном файле позволяет другим классам видеть его атрибуты, спецификатор свойства определяет, как будут создаваться его методы получения / установки.И линия синтеза фактически строит эти методы получения / установки.Я также знаю, что примитивные типы должны использовать (nonatomic,assign) вместо (nonatomic,retain), но я понятия не имею, когда я должен опустить неатомарный.

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

Ответы [ 3 ]

5 голосов
/ 16 ноября 2010

Accessorizer автоматизирует многое для вас.

3 голосов
/ 16 ноября 2010

В последней версии Clang (поставляется с XCode 4, но не в XCode 3) вы получаете @synthesize по умолчанию, а также создание ivar по умолчанию.Создание ivar по умолчанию уже работает, но не на симуляторе.С обоими этими функциями все, что вам нужно сделать, это добавить строку @property и работать с управлением памятью в dealloc

.по умолчанию используется атомарность, и что происходит, когда вы отключаете неатомарную аннотацию.Atomic гарантирует, что значение полностью установлено, прежде чем разрешить что-либо получить к нему доступ, а неатомное - нет.Atomic полезен только в ситуациях с многопоточностью и немного медленнее в однопоточных приложениях.

1 голос
/ 17 ноября 2010

Важно понимать, что делает каждая из этих строк кода.Они не все одинаковы и они не обязательно избыточны.Одна вещь, которая поможет, это использовать правильную терминологию - например, с NSObject *myObject; вы, вероятно, ссылаетесь на объявление переменной экземпляра.

Прежде всего, объявление @property в @interfaceпозволяет вам сказать, что экземпляры класса представляют часть состояния.В нем ничего не говорится о реализации этого состояния, только о том, что оно предоставляется экземплярами вашего класса и контрактом API (управление памятью, атомарность, методы) для этого состояния.

Директива @synthesize указывает компилятору создать или использовать конкретную переменную экземпляра в качестве хранилища для объявленного @property. Это не обязательно должно быть то, как вы предоставляете хранилище для свойства. Например, Core Data предоставляет свое собственное хранилище для смоделированных свойств, поэтому вместо них вы используете @dynamic.Вам также не нужно использовать переменную экземпляра с тем же именем, что и у вашего @property - чтобы расширить ваш пример выше, вы можете назвать свою переменную экземпляра myObject_, указав в свойстве object, и это совершенно нормально.*

Наконец, вы отправляете переменную экземпляра -release in -dealloc - для свойства типа объекта, помеченного retain или copy - потому что вы сказали, что будете управлять его памятью.Вы не освобождаете свойство , вы освобождаете хранилище .Если бы вы реализовали хранилище другим способом, вы бы очистили его другим способом.

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