Разъяснение декларации свойств iOS
Это вопрос из двух частей в надежде, что я смогу больше узнать о теме.
1) Мне кажется, что у вас есть два популярных варианта для объявления свойства для класса в objective c
. Один заключается в том, чтобы добавить свойство в тело класса заголовка, например.
@interface MyClass : NSObject {
NSArray *myArray;
}
Или вы можете добавить его после тела @interface
и перед оператором @end
. Таким образом.
@interface MyClass : NSObject {
//
}
@property (nonatomic, retain) NSArray *myArray;
В чем разница между этими двумя "стилями" и когда вы выбираете один над другим?
2) после @property
вы найдете такие опции, как (nonatomic, retain)
. Что это за и почему/когда вы используете разные варианты?
Ответы
Ответ 1
Вот только модификаторы свойств, которые распознает Xcode:
-
nonatomic
(не обеспечивает безопасность потока для свойства, в основном для использования, когда в программе используется только один поток)
-
atomic
(обеспечивает безопасность потока на свойстве, в основном для использования при использовании в потоке нескольких потоков) (по умолчанию)
-
retain
/strong
(автоматически сохраняет/освобождает значения в наборе, гарантирует, что значения не будут отменены неожиданно) (по умолчанию, если ARC и тип объекта)
-
readonly
(не может установить свойство)
-
readwrite
(можно установить и получить свойство) (по умолчанию)
-
assign
/unsafe_unretained
(с этим свойством не должно выполняться управление памятью, оно обрабатывается вручную лицом, назначающим значение) (по умолчанию, если не ARC или тип объекта)
-
copy
(копирует объект перед его установкой, в случаях, когда набор значений не должен меняться из-за внешних факторов (строки, массивы и т.д.).
-
weak
(автоматически обнуляет ссылку, если объект будет освобожден и не сохранит переданное значение)
-
getter=method
(устанавливает селектор, используемый для получения значения этого свойства)
-
setter= method
(установите селектор, используемый для установки значения этого свойства)
Ответ 2
1) @property - это особый способ определения методов getter и setter, или как мы называем их accessors в 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 "Свойства" из следующего учебника или купить Book, который охватывает введение в Objective-C.
Также вы должны ознакомиться с хотя бы следующими атрибутами:
- Доступ
- Выберите
readwrite
(по умолчанию) или readonly
. Если установлено readonly
, ТОЛЬКО будут доступны методы getter.
- Управление памятью Setter
-
assign
(по умолчанию) просто присваивает новое значение. Скорее всего, вы используете это только с примитивными типами данных.
-
retain
, выдает старое значение и сохраняет новое. Если вы используете сборщик мусора, retain
эквивалентен assign
. Зачем? Ручной выпуск старого значения будет выполнен сборщиком мусора.
-
copy
скопирует новое значение и выведет старое значение. Это часто используется со строками.
- Резьбонарезной
-
atomic
(по умолчанию) гарантирует, что метод setter является атомарным. Это означает, что только один поток может сразу получить доступ к установщику.
-
nonatomic
, используйте это, когда вы не работаете с потоками.
Этот пост дает хорошее представление об управлении памятью и assign
, retain
и copy
.
Ответ 3
Свойства - это в основном методы доступа. Они определяют область действия переменной.
Первый случай, как указано выше, переменная недоступна в других классах, тогда как, объявив свойство, как и во втором случае, переменная доступна и в других классах.
Кроме того, они полезны для управления памятью.
Ответ 4
Первый будет приватным объявлением и не будет доступен другим классам, если вы не определяете второй. Второй используется вместе с @synthesize в модуле .m, а setter/getter созданы для вас компилятором. Вы все равно можете определить свой собственный геттер или сеттер. В этом случае все iVars, определенные в @property, могут быть доступны другими классами. Операции повторного запуска/выпуска выполняются автоматически.
Для получения дополнительной информации вы должны прочитать документацию Apple.
пожалуйста, проверьте:
В чем разница между атомными и неатомическими атрибутами?
Ответ 5
Свойства - это в основном методы доступа. Они определяют область действия переменной. по умолчанию доступ спецификатора переменной защищен, а свойства устанавливают его спецификатор с защищенным на общедоступный