Прежде чем обсуждать атрибуты @property, вы должны знать, для чего используется @property.
@property предлагает способ определить информацию, которую класс должен инкапсулировать. Если вы объявите объект / переменную с помощью @property, то этот объект / переменная будет доступен для других классов, импортирующих его класс.
Если вы объявляете объект с помощью @property в заголовочном файле, то вы должны синтезировать его с помощью @synthesize в файле реализации.
Пример:
.ч класс
@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:
атомное.
неатомический.
сохранить.
копия.
неизменяемые.
читай пиши.
назначить.
сильный.
atomic: это поведение по умолчанию. Если объект объявлен как атомарный, он становится потокобезопасным. Потокобезопасный означает, что одновременно только один поток определенного экземпляра этого класса может иметь контроль над этим объектом.
Пример:
@property NSString *name; //by default atomic
@property (atomic)NSString *name; // explicitly declared atomic
nonatomic: не является потокобезопасным. Вы можете использовать атрибут неатомического свойства, чтобы указать, что синтезированные средства доступа просто устанавливают или возвращают значение напрямую, без каких-либо гарантий относительно того, что произойдет, если к одному и тому же значению обращаются одновременно из разных потоков. По этой причине доступ к неатомарному свойству быстрее, чем к атомарному.
@property (nonatomic)NSString *name;
retain: требуется, когда атрибут является указателем на объект. Метод setter увеличит количество сохраняемых объектов, так что он будет занимать память в пуле автоматического выпуска.
@property (retain)NSString *name;
copy: если вы используете copy, вы не можете использовать retain. Использование экземпляра экземпляра класса будет содержать собственную копию.
Даже если изменяемая строка установлена и впоследствии изменена, экземпляр захватывает любое значение, которое он имеет во время его установки. Методы получения и получения не будут синтезированы.
@property (copy) NSString *name;
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
только для чтения: если вы не хотите разрешать изменение свойства с помощью метода setter, вы можете объявить свойство только для чтения.
@property (readonly) NSString *name;
readwrite: это поведение по умолчанию. Вам не нужно явно указывать атрибут readwrite.
@property (readwrite) NSString *name;
assign: создаст установщик, который присваивает значение переменной экземпляра напрямую, а не копирует или сохраняет его. Это лучше всего подходит для примитивных типов, таких как NSInteger и CGFloat, или для объектов, которыми вы не владеете напрямую, таких как делегаты.
@property (assign) NSInteger year;
Сильный: замена для удержания.
@property (nonatomic, strong) AVPlayer *player;
unsafe_unretained: в Cocoa и Cocoa Touch есть несколько классов, которые еще не поддерживают слабые ссылки, что означает, что вы не можете объявить слабое свойство или слабую локальную переменную, чтобы отслеживать их. Эти классы включают NSTextView, NSFont и NSColorSpace и т. Д. Если вам нужно использовать слабую ссылку на один из этих классов, вы должны использовать небезопасную ссылку.
Небезопасная ссылка похожа на слабую ссылку в том, что она не поддерживает связанный объект, но для него не будет установлено значение nil, если целевой объект освобожден.
@property (unsafe_unretained) NSObject *unsafeProperty;