Подтвердить что ты не робот

Разъяснение декларации свойств iOS

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

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

@interface MyClass : NSObject {
    NSArray *myArray;
}

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

@interface MyClass : NSObject {
    //
}

@property (nonatomic, retain) NSArray *myArray;

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

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

4b9b3361

Ответ 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

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