Зачем использовать свойства? - PullRequest
2 голосов
/ 11 сентября 2011

Итак, я программирую на Objective-C уже больше года, и я не могу понять, как использовать свойства. Я искал в Интернете несколько раз, но так и не нашел хорошего объяснения. Я понимаю, как их создать:

@property (something, something) something *variableName;
@syntheize variableName;

Но я должен сделать все мои свойства переменных экземпляра. Для меня, насколько я знаю, это кажется пустой тратой кода. Но когда я смотрю на код онлайн, иногда я вижу около 25 свойств в одном классе. Который я считаю пустой тратой. Единственный раз, когда я их использую, это когда передаю информацию из выбранной ячейки UITableView в деталь viewController. Для этого я использую:

@property (copy) NSString *myString;

Можете ли вы также объяснить, что означают: nonatomic, copy, retain, assign и т. Д.

Спасибо

Ответы [ 5 ]

7 голосов
/ 11 сентября 2011

Эти свойства являются вспомогательными методами для создания геттеров и сеттеров.


Atmoic v Неатомные

Предполагая, что вы @synthesizing реализации метода, атомарныепротив неатомарных изменений сгенерированного кода.Если вы пишете свой собственный метод set / getter, atomic / nonatomic / retain / assign / copy просто рекомендательный.

С помощью atomic синтезированный метод set / getter гарантирует, что целое значение всегда будет возвращено из метода get илиустанавливается сеттером, независимо от активности сеттера в любом другом потоке.То есть, если поток A находится в середине метода получения, а поток B вызывает метод установки, фактическое жизнеспособное значение - объект с автоматически освобожденным кодом, скорее всего, - будет возвращено вызывающей стороне в A.

Inнеатомные, такие гарантии не предоставляются.Таким образом, неатомарная значительно быстрее атомарной.

Чего не делает атомарная, так это не дает никаких гарантий безопасности потоков.Если поток A вызывает метод получения одновременно, а поток B и C вызывают метод установки с различными значениями, поток A может получить любое одно из трех возвращенных значений - одно до вызова любого метода установки или любое из значений, переданных в методы установкив B и C. Аналогичным образом, объект может в конечном итоге получить значение из B или C. Невозможно сказать.

Обеспечение целостности данных - одна из основных задач многопоточного программирования - достигаетсядругими способами.


Назначение, сохранение, копирование

В двух словах, назначение vs сохранение vs копия определяет, как синтезированные средства доступа взаимодействуют с Objective CСхема управления памятью:

  • назначение является значением по умолчанию и просто выполняет присвоение переменной
  • retain указывает, что новое значение должно быть отправлено -retain при назначении, а старое значение отправлено Release
  • copy указывает, что новое значение должно быть отправлено -copy при назначении, а старое значение отправлено.

ReСохраняемый элемент выполняется для созданного объекта (это увеличивает количество ссылок), тогда как копия создает новый объект.Разница в том, хотите ли вы добавить еще одно сохранение к объекту или создать совершенно новый объект.

3 голосов
/ 11 сентября 2011

Свойства - хорошая техника для выставления значений.Не следует раскрывать все переменные экземпляра, поскольку это нарушит хорошую инкапсуляцию ООП.

Вот документация Apple по этому вопросу.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

Ключевой момент:

Объявленные свойства решают проблемы со стандартными методами доступа, предоставляя следующие функции:

  • Объявление свойства обеспечивает четкую, явную спецификацию поведения методов доступа.
  • Компилятор может синтезировать методы доступа для вас согласно спецификации, указанной в объявлении.Это означает, что у вас меньше кода для написания и обслуживания.
  • Свойства представлены синтаксически в виде идентификаторов и имеют область видимости, поэтому компилятор может обнаружить использование необъявленных свойств.
0 голосов
/ 11 сентября 2011

Если вам нужны геттеры и сеттеры для предоставления некоторых переменных экземпляра, или если вам нужно автоматическое управление сохранением / разблокировкой памяти или потоковые методы доступа, тогда свойства - это менее подробный способ автоматического создания этих интеллектуальных геттеров и сеттеров. Если вы не хотите показывать что-либо вне объекта или потока и не хотите управлять памятью во время выполнения (скажем, для некоторой структуры malloc'd C), тогда свойства могут быть либо пустой тратой, либо синтаксическим сахаром (который может или не может быть) улучшить читаемость кода), или поместить туда кодировщик, который не знает разницы.

0 голосов
/ 11 сентября 2011

Свойства - хорошая функция, которая автоматически дает вам метод получения и установки, синтезируя, и облегчает вашу работу, не устанавливая и не получая значение.

Свойство может быть объявлено как «только для чтения» и может быть снабжено семантикой хранения, такой как «назначить», «копировать» или «сохранить». По умолчанию свойства считаются атомарными, что приводит к блокировке, предотвращающей одновременный доступ к ним нескольких потоков. Свойство может быть объявлено как «неатомное», что удаляет эту блокировку (ссылка из http://en.wikipedia.org/wiki/Objective-C#Properties).

0 голосов
/ 11 сентября 2011

Свойства включают автоматическую обработку переменных. Поэтому, когда вы делаете синтез, компилятор сгенерирует ваши методы получения и установки, позволяющие сделать class.variableName = value (указывая, что компилятор выполнит [class variableName: value].

Довольно приличное объяснение свойств здесь: http://cocoacast.com/?q=node/103

...