Прежде чем вы узнаете об атрибутах @property, вы должны знать, что такое @property.
@property предлагает способ определить информацию, которую класс должен инкапсулировать. Если вы объявите объект / переменную с помощью @property , то этот объект / переменная будет доступен для других классов, импортирующих его класс.
Если вы объявляете объект с помощью @property в заголовочном файле, то вы должны синтезировать его с помощью @synthesize в файле реализации. Это делает объект KVC-совместимым . По умолчанию компилятор синтезирует методы доступа для этого объекта.
Методы доступа: сеттер и геттер.
Пример: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Теперь компилятор будет синтезировать методы доступа для имени .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Список атрибутов @property
атомарный, неатомный, сохранить, скопировать, только для чтения, перезаписать, назначить, сильный, getter = метод, setter = метод, unsafe_unretained
атомарное поведение по умолчанию. Если объект объявлен как атомарный, он становится потокобезопасным. Потокобезопасный означает, что одновременно только один поток конкретного экземпляра этого класса может иметь контроль над этим объектом.
Если поток выполняет метод получения, тогда другой поток не может выполнить метод установки для этого объекта. Это медленно.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
- неатомный не является потокобезопасным. Вы можете использовать атрибут неатомного свойства, чтобы указать, что синтезированные средства доступа просто устанавливают или возвращают значение напрямую, без каких-либо гарантий относительно того, что произойдет, если к одному и тому же значению обращаются одновременно из разных потоков.
По этой причине доступ к неатомарному свойству быстрее, чем к атомарному.
@property (nonatomic)NSString *name;
- retain требуется, когда атрибут является указателем на объект.
Метод setter увеличивает количество сохраняемых объектов, так что он будет занимать память в пуле авто-релиза.
@property (retain)NSString *name;
- копия Если вы используете копию, вы не можете использовать сохранить. Использование экземпляра экземпляра класса будет содержать свою собственную копию.
Даже если изменяемая строка установлена и впоследствии изменена, экземпляр захватывает любое значение, которое он имеет во время его установки. Методы получения и получения не будут синтезированы.
@property (copy) NSString *name;
сейчас,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
имя останется без изменений.
- readonly Если вы не хотите разрешать изменение свойства с помощью метода setter, вы можете объявить свойство только для чтения.
Компилятор будет генерировать геттер, но не сеттер.
@property (readonly) NSString *name;
- readwrite - это поведение по умолчанию. Вам не нужно явно указывать атрибут readwrite.
Это противоположно только для чтения.
@property (readwrite) NSString *name;
- assign создаст установщик, который присваивает значение переменной экземпляра напрямую, а не копирует или сохраняет его. Это лучше всего подходит для примитивных типов, таких как NSInteger и CGFloat, или для объектов, которыми вы не владеете напрямую, таких как делегаты.
Имейте в виду, что функции сохранения и назначения в принципе взаимозаменяемы, когда включена сборка мусора.
@property (assign) NSInteger year;
- Сильный является заменой для удержания.
Это идет с ARC.
@property (nonatomic, strong) AVPlayer *player;
- getter = method Если вы хотите использовать другое имя для метода getter, можно указать пользовательское имя, добавив атрибуты в свойство.
В случае логических свойств (свойств, имеющих значение YES или NO), метод getter обычно начинается со слова «is»
@property (getter=isFinished) BOOL finished;
- setter = метод Если вы хотите использовать другое имя для метода сеттера, можно указать пользовательское имя, добавив атрибуты в свойство.
Метод должен заканчиваться двоеточием.
@property(setter = boolBool:) BOOL finished;
- unsafe_unretained В Какао и Какао Touch есть несколько классов, которые еще не поддерживают слабые ссылки, что означает, что вы не можете объявить слабое свойство или слабую локальную переменную, чтобы отслеживать их. Эти классы включают NSTextView, NSFont и NSColorSpace и т. Д. Если вам нужно использовать слабую ссылку на один из этих классов, вы должны использовать небезопасную ссылку.
Небезопасная ссылка похожа на слабую ссылку в том, что она не поддерживает связанный объект, но для него не будет установлено значение nil, если целевой объект освобожден.
@property (unsafe_unretained) NSObject *unsafeProperty;
Если вам нужно указать несколько атрибутов, просто включите их в список через запятую, например так:
@property (readonly, getter=isFinished) BOOL finished;