Прежде чем обсуждать о признаках @property, вы должны знать, что использование @property. @property предлагает способ определения информации о том, что класс предназначен для инкапсуляции. Если вы объявляете объект / переменную с помощью @property, то, что объект / переменная будет доступна для других классов, импортирующих его класс. Если вы объявляете объект, используя @property в заголовочном файле, то вы должны синтезировать его с помощью @synthesize в файле реализации.
Пример:
.h класс
@interface ExampleClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m класс
@implementation ExampleClass
@synthesize name;
@end
Теперь компилятор будет синтезировать аксессор методы для имени.
ExampleClass *newObject=[[ExampleClass alloc]init];
NSString *name1=[newObject name]; // get 'name'
[obj setName:@“Tiger”];
Список атрибутов @property: атомный. неатомический. сохранить. копия. неизменяемые. читай пиши. назначить. сильный.
атомное: Это поведение по умолчанию. Если объект объявлен как атомные, то становится потокобезопасно. Поточно-средства, в то время только один поток конкретного экземпляра этого класса может иметь контроль над этим объектом.
Пример :
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
неатомический: Это не потокобезопасно. Вы можете использовать атрибут неатомического свойства, чтобы указать, что синтезированные аксессор просто установить или вернуть значение непосредственно, без каких-либо гарантий относительно того, что произойдет, если то же самое значение обращается одновременно из разных потоков. По этой причине, это быстрее, чтобы получить доступ к неатомическому свойству, чем атомарный.
@property (nonatomic)NSString *name;
сохранить: требуется, когда атрибут является указателем на метод сеттера object.The увеличит сохранить счетчик объекта, так что он будет занимать память в autorelease бассейна.
@property (retain)NSString *name;
копия: Если вы используете копию, вы не можете использовать сохранить. Использование копии экземпляра класса будет содержать свою собственную копию. Даже если изменяемая строка устанавливаются и впоследствии изменена, экземпляр фиксирует любое значение оно имеет в то время он установлен. будет синтезирован Нет и присваивателя методы.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
только для чтения: Если вы не хотите, чтобы свойство быть изменено с помощью присваивателя, вы можете объявить свойство только для чтения.
@property (readonly) NSString *name;
чтение и запись: это поведение по умолчанию. Вам не нужно указывать READWRITE атрибут в явном виде.
@property (readwrite) NSString *name;
назначить: генерирует сеттер, который присваивает значение переменной экземпляра напрямую, а не копировать или удерживать его. Это лучше для примитивных типов, таких как NSInteger и CGFloat, или объекты, которые вы непосредственно не принадлежит, например, делегатов.
@property (assign) NSInteger year;
сильный: замена для сохранения.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: Есть несколько классов в какао и Cocoa Touch, которые пока не поддерживают слабые ссылки, а значит, вы не можете объявить слабое свойство или слабую локальную переменную, чтобы следить за ними. Эти классы включают NSTextView, NSFont и NSColorSpace и т.д.. Если вам нужно использовать слабую ссылку на один из этих классов, вы должны использовать небезопасные ссылки. Небезопасная ссылка похожа на нерабочую ссылку в том, что он не держит связанный с ним объект жив, но он не будет установлен в ноль, если объект назначения освобождаться.
@property (unsafe_unretained) NSObject *unsafeProperty;