Прочитав много статей, я решил собрать всю информацию об атрибутах:
- атомарный // по умолчанию
- неатомической
- strong = сохранить // по умолчанию
- Слабый = unsafe_unretained
- сохранить
- назначить // по умолчанию
- unsafe_unretained
- копия
- * только для чтения * 1023
- readwrite // по умолчанию
Ниже приведена ссылка на подробную статью, где вы можете найти эти атрибуты.
Большое спасибо всем людям, которые дают лучшие ответы здесь !!
Атрибуты переменных свойств или модификаторы в iOS
Вот пример описания из статьи
- атомное
-Атомный означает, что только один поток имеет доступ к переменной (статический тип).
-Атомный потокобезопасный.
- но это медленно в производительности
-атомное поведение по умолчанию
-Атомные средства доступа в среде без сбора мусора (т.е. при использовании retain / release / autorelease) будут использовать блокировку для
убедитесь, что другой поток не мешает правильной установке / получению значения.
Это на самом деле не ключевое слово.
Пример:
@property (retain) NSString *name;
@synthesize name;
- неатомический
-Nonatomic означает многопоточный доступ к переменной (динамический тип).
-Nonatomic это поток небезопасно.
- но это быстро в производительности
-Nonatomic НЕ является поведением по умолчанию, нам нужно добавить ключевое слово nonatomic в атрибуте свойства.
-это может привести к неожиданному поведению, когда два разных процесса (потока) одновременно обращаются к одной и той же переменной.
Пример: * * тысяча пятьдесят-семь
@property (nonatomic, retain) NSString *name;
@synthesize name;
Объясните:
Предположим, что есть атомарное строковое свойство с именем "name", и если вы вызываете [self setName: @ "A"] из потока A,
вызовите [self setName: @ "B"] из потока B и вызовите [self name] из потока C, тогда все операции в другом потоке будут выполняться последовательно, что означает, что если один поток выполняет установщик или получатель, тогда другие потоки будут ждать , Это делает свойство "name" доступным для чтения / записи, но если другой поток D одновременно вызывает [name release], то эта операция может привести к сбою, так как здесь нет никакого вызова setter / getter. Это означает, что объект является безопасным для чтения / записи (ATOMIC), но не потокобезопасным, поскольку другие потоки могут одновременно отправлять объекту сообщения любого типа. Разработчик должен обеспечить безопасность потоков для таких объектов.
Если свойство "name" было неатомичным, то все потоки в приведенном выше примере - A, B, C и D будут выполняться одновременно, что приведет к непредсказуемому результату. В случае атомарного, любой из A, B или C будет выполняться первым, но D все еще может выполняться параллельно.
- Сильный (iOS4 = сохранить)
-это говорит "держи это в куче, пока я не укажу на это больше"
Другими словами: «Я владелец, вы не можете иметь дело с этим до того, как прицельтесь на то же самое, что и удержите»
-Вы используете сильные, только если вам нужно сохранить объект.
-По умолчанию все переменные экземпляра и локальные переменные являются сильными указателями.
-Мы обычно используем strong для UIViewControllers (родителей элемента пользовательского интерфейса)
-strong используется с ARC, и он в основном помогает вам, не беспокоясь о сохранении счета объекта. ARC автоматически выпускает его для вас, когда вы закончите. Использование ключевого слова strong означает, что вы владеете объектом.
Пример:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
- слабый (iOS4 = unsafe_unretained)
-это говорит: «Держите это, пока кто-то еще сильно на это указывает»
- то же самое, что присваивать, не сохранять или освобождать
-Слабая ссылка - это ссылка, которую вы не сохраняете.
-Мы обычно используем слабый для IBOutlets (потомков UIViewController). Это работает, потому что только дочерний объект
должен существовать до тех пор, пока существует родительский объект.
-слабая ссылка - это ссылка, которая не защищает указанный объект от сбора сборщиком мусора.-Слабость, по сути, присваивать, оставшееся свойство. За исключением случаев, когда объект освобожден, для слабого указателя автоматически устанавливается ноль
Пример:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Сильное и слабое объяснение, Благодаря Би Джей Гомеру :
Представьте, что наш объект - собака, и что собака хочет убежать (быть освобожденной).
Сильные указатели похожи на поводок на собаку. Пока у вас есть поводок, привязанный к собаке, собака не убежит. Если пять человек прикрепят поводок к одной собаке (пять сильных указателей на один объект), то собака не убежит, пока все пять поводков не отсоединятся.
Слабые указатели, с другой стороны, похожи на маленьких детей, указывающих на собаку и говорящих "Смотри! Собака!" Пока собака все еще на поводке, маленькие дети все еще могут видеть собаку, и они все еще будут указывать на нее. Однако, как только поводки отстегнуты, собака убегает независимо от того, сколько на нее указывают маленькие дети.
Как только последний сильный указатель (поводок) больше не указывает на объект, объект будет освобожден, а все слабые указатели будут обнулены.
Когда мы используем слабые?
Единственный раз, когда вы хотите использовать слабый, это если вы хотите избежать сохранения циклов
(например, родитель сохраняет ребенка, а ребенок сохраняет родителя, поэтому ни один из них не освобождается).
- сохранить = сильный
- сохраняется, старое значение освобождается и ему присваивается
-retain указывает, что новое значение должно быть отправлено -retain при присвоении, а старое значение отправлено -release
-сдержать так же, как сильный.
-apple говорит, что если вы напишите сохранить, он будет автоматически преобразован / работать только как сильный.
-методы типа «alloc» включают в себя неявное «retain»
Пример:
@property (nonatomic, retain) NSString *name;
@synthesize name;
- присвоить
-assign является значением по умолчанию и просто выполняет присвоение переменной
-assign - это атрибут свойства, который сообщает компилятору, как синтезировать реализацию метода установки свойства
-Я бы использовал для примитивных свойств C назначение и для слабых ссылок на объекты Objective-C слабые.
Пример:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained - квалификатор владения, который сообщает ARC, как вставлять вызовы удержания / освобождения
-unsafe_unretained - это версия ARC для присвоения.
Пример:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
- копия
-копия требуется, когда объект изменчив.
-copy указывает, что новое значение должно быть отправлено -copy при назначении, а старое значение отправлено -release.
-copy похоже на то, что retain возвращает объект, который вы должны явно освободить (например, в dealloc) в средах без сбора мусора.
-Если вы используете копию, то вам все еще нужно выпустить ее в dealloc.
-Используйте это, если вам нужно, чтобы значение объекта было таким, как оно есть в данный момент, и вы не хотите, чтобы это значение отражало какие-либо изменения, сделанные другими
владельцы объекта. Вам нужно будет освободить объект, когда вы закончите с ним, потому что вы сохраняете копию.
Пример: * * тысяча сто двадцать три
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;