Свойства класса (properties)

Содержание

Слайд 2

Общая схема

Общая схема

Слайд 3

Атрибуты свойств классов

- атрибуты доступности (readonly/readwrite);
- атрибуты владения (retain/strong/copy/assign/unsafe_unretained/weak);
- атрибут атомарности (atomic/nonatomic);
-

Атрибуты свойств классов - атрибуты доступности (readonly/readwrite); - атрибуты владения (retain/strong/copy/assign/unsafe_unretained/weak); -
nullability атрибут (null_unspecified/null_resettable/nullable/nonnull) — появился в xcode 6.3.

Слайд 4

Атрибуты доступности

- readwrite — указывает, что свойство доступно и на чтение,

Атрибуты доступности - readwrite — указывает, что свойство доступно и на чтение,
и на запись, то есть будут сгенерированы и сеттер, и геттер. Это значение задается всем свойствам по умолчанию, если не задано другое значение;
- readonly — указывает, что свойство доступно только для чтения. Это значение стоит применять в случаях, когда изменение свойства «снаружи» во время выполнения объектом своей задачи нежелательно, либо когда значение свойства не хранится ни в какой переменной, а генерируется исходя из значений других свойств.

Слайд 5

Атрибуты владения - RETAIN

- retain (соответствующая переменная должна быть с атрибутом __strong)

Атрибуты владения - RETAIN - retain (соответствующая переменная должна быть с атрибутом
— это значение показывает, что в сгенерированном сеттере счетчик ссылок на присваиваемый объект будет увеличен, а у объекта, на который свойство ссылалось до этого, — счетчик ссылок будет уменьшен. Это значение применимо при выключенном ARC для всех Objective-C классов во всех случаях, когда никакие другие значения не подходят. Это значение сохранилось со времен, когда ARC еще не было и, хотя ARC и не запрещает его использование, при включенном автоматическом подсчете ссылок лучше вместо него использовать strong.

Слайд 6

Атрибуты владения - STRONG

- strong (соответствующая переменная должна быть с атрибутом __strong)

Атрибуты владения - STRONG - strong (соответствующая переменная должна быть с атрибутом
— это значение аналогично retain, но применяется только при включенном автоматическом подсчете ссылок. При использовании ARC это значение используется по умолчанию.

Слайд 7

Атрибуты владения - COPY

- copy (соответствующая переменная должна быть с атрибутом

Атрибуты владения - COPY - copy (соответствующая переменная должна быть с атрибутом
__strong) — при таком значении атрибута владения в сгенерированном сеттере соответствующей переменной экземпляра присваивается значение, возвращаемое сообщением copy, отправленным присваиваемому объекту. Использование этого значения атрибута владения накладывает некоторые ограничения на класс объекта:
1) класс должен поддерживать протокол NSCopying;
2) класс не должен быть изменяемым (mutable). У некоторых классов есть mutable-подкласс, например, NSString-NSMutableString. Если ваше свойство — экземпляр «мутабельного» класса, использование copy приведет к нежелательным последствиям, так как метод copy вернет экземпляр его «немутабельного» сородича. Например, вызов copy у экземпляра NSMutableString вернет экземпляр NSString.

Слайд 8

Атрибуты владения - WEAK

- weak (соответствующая переменная должна быть с атрибутом __weak)

Атрибуты владения - WEAK - weak (соответствующая переменная должна быть с атрибутом
— это значение аналогично assign и unsafe_unretained. Разница в том, что особая уличная магия позволяет переменным с таким значением атрибута владения менять свое значение на nil, когда объект, на который указывала переменная, уничтожается, что очень хорошо сказывается на устойчивости работы приложения.

Слайд 9

Атрибуты владения – UNSAFE_UNRETAINED

- unsafe_unretained (соответствующая переменная должна быть с атрибутом

Атрибуты владения – UNSAFE_UNRETAINED - unsafe_unretained (соответствующая переменная должна быть с атрибутом
__unsafe_unretained) — свойство с таким типом владения просто сохраняет адрес присвоенного ему объекта. Методы доступа к такому свойству никак не влияют на счетчик ссылок объекта. Он может удалиться, и тогда обращение к такому свойству приведет к крэшу (потому и unsafe).

Слайд 10

Атрибуты владения – ASSIGN

- assign (соответствующая переменная должна быть с атрибутом __unsafe_unretained,

Атрибуты владения – ASSIGN - assign (соответствующая переменная должна быть с атрибутом
но так как атрибуты владения есть только у типов попадающих под ARC, с которыми лучше использовать strong или weak, это значение вам вряд ли понадобится) — просто присвоение адреса. Без ARC является дефолтным значением атрибута владения. Его стоит применять к свойствам типов, не попадающих под действие ARC (к ним относятся примитивные типы).

Слайд 12

Атрибуты атомарности - ATOMIC

- atomic — это дефолтное значение для данного

Атрибуты атомарности - ATOMIC - atomic — это дефолтное значение для данного
атрибута. Оно означает, что акцессор и мутатор будут сгенерированы таким образом, что при обращении к ним одновременно из разных потоков, они не будут выполняться одновременно (то есть все равно сперва один поток сделает свое дело — задаст или получит значение, и только после этого другой поток сможет заняться тем же). Из-за особенностей реализации у свойств с таким значением атрибута атомарности нельзя переопределять только один из методов доступа.

Слайд 13

Атрибуты атомарности - NONATOMIC

- nonatomic — значение противоположное atomic — у

Атрибуты атомарности - NONATOMIC - nonatomic — значение противоположное atomic — у
свойств с таким значением атрибута атомарности методы доступа не обременены защитой от одновременного выполнения в разных потоках, поэтому выполняются быстрее. Это значение пригодно для большинства свойств, так как большинство объектов все-таки используются только в одном потоке, и нет смысла «обвешивать» их лишними фичами.