разъяснение объявления свойства iOS - PullRequest
20 голосов
/ 06 февраля 2012

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

1) Мне кажется, что у вас есть два популярные варианты объявления свойства для класса в objective c.Одним из них является добавление свойства в тело класса заголовка, например.

@interface MyClass : NSObject {
    NSArray *myArray;
}

Или вы можете добавить его после тела @interface и до оператора @end , например, .

@interface MyClass : NSObject {
    //
}

@property (nonatomic, retain) NSArray *myArray;

В чем разница между этими двумя "стилями" и когда вы выбираете один над другим?

2) после @property вы найдете вариантытакие как (nonatomic, retain).Для чего и почему / когда вы используете разные варианты?

Ответы [ 5 ]

47 голосов
/ 06 февраля 2012

Вот единственные модификаторы свойств, которые распознает XCode:

  • nonatomic (не обеспечивает безопасность потока для свойства, главным образом для использования, когда в программе должен использоваться только один поток)
  • atomic (обеспечивает безопасность потока в свойстве, главным образом для использования, когда в программе должно использоваться несколько потоков) (по умолчанию)
  • retain / strong (автоматически сохраняет / освобождаетзначения на множестве, гарантирует, что значения не освобождаются неожиданно) (по умолчанию, если ARC и тип объекта)
  • readonly (невозможно установить свойство)
  • readwrite (можно установить и получить свойство) (по умолчанию)
  • assign / unsafe_unretained (с этим свойством не должно осуществляться управление памятью, оно обрабатывается вручную лицом, присваивающим значение) (по умолчанию, если не ARC или тип объекта)
  • copy (копирует объект перед его настройкой, в тех случаях, когда установленное значение не должно изменяться из-за внешних факторов (строк, массивов и т. Д.).
  • weak (автоматически обнуляет ссылкуесли объект освобожден и не сохраняет переданное значение)
  • getter=method (устанавливает селектор, используемый для получения значения этого свойства)
  • setter= method (устанавливает селекториспользуется для установки значения этого свойства)
28 голосов
/ 06 февраля 2012

1) @property - это особый способ определения методов получения и установки, или, как мы их называем, методов доступа в Objective-C. Ваш первый фрагмент просто объявляет массив, для которого вы должны объявить и написать методы доступа самостоятельно. Например setMyArray: и myArray.
Использование @property объявит ваши средства доступа для вас и эквивалентно объявлению setMyArray: и myArray самостоятельно. Это предпочтительный способ объявить средства доступа начиная с Objective-C 2.0. Обратите внимание, что вы все равно должны объявить свойство (в вашем случае myArray) самостоятельно.

2) Сначала вам нужно узнать о @synthesize. Помните, что @property ОБЪЯВЛЯЕТ средства доступа для вашей собственности, @synthesize их ОСУЩЕСТВЛЯЕТ. Когда вы используете @property в своем @interface, вы, скорее всего, пишете @synthesize в @implementation. Использование @synthesize эквивалентно реализации setMyArray: и myArray.
Атрибуты (nonatomic, retain) сообщают компилятору, среди прочего, как должно работать управление памятью и, следовательно, как будут реализованы методы. Обратите внимание, что вы никогда не увидите эти средства доступа, но будьте уверены, что они есть и готовы к использованию.

Чтобы узнать больше по этой теме, я рекомендую прочитать Раздел 9, посвященный свойствам, из следующего Учебного пособия или купить Книгу , в которой содержится введение в Objective-C.

Также вам следует ознакомиться хотя бы со следующими атрибутами:

  • Доступ
    • Выберите readwrite (по умолчанию) или readonly. Если установлено readonly, будут доступны ТОЛЬКО методы получения.
  • Setter Memory Management
    • assign (по умолчанию), просто присваивает новое значение. Скорее всего, вы используете это только с примитивными типами данных.
    • retain, освобождает старое значение и сохраняет новое. Если вы используете сборщик мусора, retain эквивалентно assign. Зачем? Ручное удаление старого значения будет выполнено сборщиком мусора.
    • copy скопирует новое значение и освободит старое значение. Это часто используется со строками.
  • Threading
    • atomic (по умолчанию) гарантирует, что метод установки является атомарным. Это означает, что только один поток может получить доступ к сеттеру одновременно.
    • nonatomic, используйте это, когда вы не работаете с потоками.

Этот пост дает хорошее представление об управлении памятью и assign, retain и copy.

2 голосов
/ 04 апреля 2014

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

0 голосов
/ 31 октября 2014

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

0 голосов
/ 06 февраля 2012

Первый будет закрытым объявлением и не будет доступен другим классам, если вы не определите второй.Второй используется вместе с @synthesize в модуле .m, а компилятор создает для вас методы setter / getter.Вы все еще можете определить свой собственный метод получения или установки с этим.В этом случае все iVars, определенные в @property, могут быть доступны для других классов. Операции сохранения / выпуска выполняются автоматически.Вы должны прочитать документацию Apple для более подробной информации.пожалуйста, проверьте: В чем разница между атомарными и неатомарными атрибутами?

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