@свойство сохранять, назначать, копировать, неатомное в Objective-C

Как кто-то, кто новичок в Objective-C может ли кто-нибудь дать мне обзор сохранения, назначения, копирования и любых других, которых мне не хватает, которые следуют директиве @property? Что они делают и почему я хочу использовать один над другим?

4 ответов


статья, связанная с MrMage, больше не работает. Итак, вот что я узнал в моем (очень) коротком кодировании времени в Objective-C:

неатомные против атомных - "atomic"по умолчанию. Всегда используйте "неатомный". Я не знаю почему, но в книге, которую я прочитал, говорится, что "редко есть причина" использовать "атомный". (Кстати: книга, которую я читаю, - это книга BNR "Программирование iOS".)

readwrite против readonly - "readwrite"по умолчанию. Когда вы @ synthesize, как геттер, так и сеттер будут быть созданы для вас. Если вы используете "readonly", сеттер не будет создан. Используйте его для значения, которое вы не хотите изменять после создания экземпляра объекта.

сохранить и скопировать и присвоить

  • "назначить" по умолчанию. В сеттере, созданном @synthesize, значение будет просто присвоено атрибуту. Я понимаю ,что "назначить" следует использовать для атрибутов без указателя.
  • "сохранить" необходимо, когда атрибут является указателем на объект. Сеттер, сгенерированный @synthesize, сохранит (aka add a retain count) объект. Вам нужно будет освободить объект, когда вы закончите с ним.
  • "копировать" необходимо, когда объект является изменяемым. Используйте это, если вам нужно значение объекта как он есть в данный момент, и вы не хотите, чтобы значение, чтобы отразить любые изменения, сделанные другими владельцами объекта. Вам нужно будет освободить объект, когда вы закончите с ним, потому что вы сохраняете копировать.

прежде чем вы узнаете об атрибутах @property, вы должны знать, что такое использование @property.

  • @property предлагает способ определения информации, которую класс предназначен для инкапсуляции. Если вы объявляете объект/переменную с помощью @property, тогда этот объект / переменная будут доступны для других классов, импортирующих его класс.

  • если вы объявляете объект, используя @property в заголовочном файле, то вы должны синтезировать его с помощью @synthesize в файле реализации. Это делает объект KVC совместимый. По умолчанию, компилятор будет синтезировать методы-аксессоры для данного объекта.

  • методы доступа : сеттер и геттер.

пример: .h

@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end

@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

    атомарный, неатомный, сохранить, копировать, только для чтения, readwrite, assign, strong, getter=method, setter=method, unsafe_unretained

  • атомные это поведение по умолчанию. Если объект объявлен как атомарный, он становится потокобезопасным. Потокобезопасность означает, только одно нить конкретный экземпляр этого класса может иметь контроль над этим объектом.

если поток выполняет метод getter, то другой поток не может выполнить метод setter для этого объекта. Это медленно.

@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
  • неатомической не является потокобезопасным. Можно использовать атрибут неатомного свойства, чтобы указать, что синтезированные методы доступа просто устанавливают или возвращают значение напрямую, без каких-либо гарантий о том, что произойдет, если одно и то же значение доступно одновременно из разных потоков.

по этой причине, он быстрее получить доступ к свойству неатомической, чем атомарного.

@property (nonatomic)NSString *name;   
  • сохранить требуется, когда атрибут является указателем на объект.

метод setter увеличит количество сохранений объекта, так что он будет занимать память в autorelease бассейн.

@property (retain)NSString *name;
  • скопировать если вы используете copy, вы не можете использовать retain. С помощью экземпляра класса содержит собственную копию.

даже если изменяемая строка задана и впоследствии изменена, экземпляр захватывает любое значение, которое он имеет в момент установки. Нет сеттеры и геттеры. будут синтезированы.

@property (copy) NSString *name;

теперь

NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];    
xyzObj.name = nameString;    
[nameString appendString:@"Pizza"]; 

имя остаются неизменными.

  • только для чтения если вы не хотите, чтобы свойство было изменено с помощью метода setter, вы можете объявить свойство только для чтения.

компилятор будет генерировать геттер, но не сеттер.

@property (readonly) NSString *name;
  • readwrite это поведение по умолчанию. Вам не нужно явно указывать атрибут записи.

это противоположность только для чтения.

@property (readwrite) NSString *name;
  • присвоить генерирует сеттер, который присваивает значение переменной экземпляра напрямую, а не копирует или сохраняет его. Это лучше всего подходит для примитивных типов, таких как NSInteger и CGFloat, или объектов, которыми вы не владеете напрямую, таких как делегаты.

имейте в виду, что сохранение и назначение в основном взаимозаменяемы, когда сбор мусора включен.

@property (assign) NSInteger year;
  • сильный замена для сохранения.

он поставляется с ARC.

@property (nonatomic, strong) AVPlayer *player; 
  • getter=метод если вы хотите использовать другое имя для метода getter, можно указать пользовательское имя, добавив атрибуты к свойству.

в случае булевых свойств (свойства, которые имеют значение да или нет), это обычно для геттера способ начать со слова "это"

@property (getter=isFinished) BOOL finished;
  • сеттер=метод если вы хотите использовать другое имя для метода setter, можно указать пользовательское имя, добавив атрибуты к свойству.

метод должен заканчиваться двоеточием.

@property(setter = boolBool:) BOOL finished;
  • unsafe_unretained есть несколько классов в Cocoa и Cocoa Touch, которые еще не поддерживают слабые ссылки, что означает, что вы не можете объявите слабое свойство или слабую локальную переменную, чтобы отслеживать их. Эти занятия включают в NSTextView, NSFont и NSColorSpace и т. д. Если необходимо использовать слабую ссылку на один из этих классов, необходимо использовать небезопасную ссылку.

небезопасная ссылка похожа на слабую ссылку в том, что она не сохраняет свой Связанный объект живым, но он не будет установлен в Нил если объект назначения освобожден.

@property (unsafe_unretained) NSObject *unsafeProperty;

Если вам нужно указать несколько атрибутов, просто включите их в список, разделенный запятыми, например:

@property (readonly, getter=isFinished) BOOL finished;

после прочтения многих статей я решил собрать всю информацию вместе атрибутов:

  1. atomic / / по умолчанию
  2. неатомической
  3. strong=сохранить / / по умолчанию
  4. слаб= unsafe_unretained
  5. сохранить
  6. назначение //по умолчанию
  7. unsafe_unretained
  8. скопировать
  9. только для чтения
  10. readwrite / / по умолчанию

ниже приведена ссылка на подробную статью, где вы можете найти эти атрибуты.

большое спасибо всем людям, которые дают лучшие ответы здесь!!

атрибуты или модификаторы свойств переменных в iOS

вот пример описания из статьи

  1. атомные - Атомные средства только один поток обращается к переменной (статический тип). - Atomic является потокобезопасным. - но это медленно в исполнении -атомная-это поведение по умолчанию - Атомарные аксессоры в среде без мусора (т. е. при использовании retain/release / autorelease) будут использовать блокировку для убедитесь, что другой поток не мешает правильной настройке/получению значения. - на самом деле это не ключевое слово.

пример :

@property (retain) NSString *name;

@synthesize name;
  1. неатомической - Неатомный означает несколько потоков доступа к переменной (динамический тип). - Неатомные нити небезопасны. -но он быстр в исполнении - Nonatomic не является поведением по умолчанию, нам нужно добавить ключевое слово nonatomic в атрибут свойства. -это может привести к неожиданному поведению, когда два разных процесса (потока) обращаются к одной и той же переменной одновременно.

пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;

объясняю:

предположим, что существует атомарное строковое свойство с именем "name", и если вы вызываете [self setName:@ "A"] из потока A, вызовите [self setName:@ "B"] из потока B и вызовите [self name] из потока C, тогда все операции над другим потоком будут выполняться последовательно, что означает, что если один поток выполняет сеттер или геттер, то другие потоки будут ждать. Это делает свойство "name" безопасным для чтения/записи, но если другой поток D вызывает [освобождение имени] одновременно, эта операция может привести к сбою, потому что здесь нет вызова setter/getter. Это означает, что объект безопасен для чтения / записи (Атомарный), но не потокобезопасный, поскольку другие потоки могут одновременно отправлять сообщения любого типа объекту. Разработчик должен обеспечить потокобезопасность для таких объектов.

если свойство "name" было неатомным, то все потоки в приведенном выше примере - A,B, C и D будут выполняться одновременно, производя любой непредсказуемый результат. В случае atomic либо один из A, B или C будет выполняться первым, но D все равно может выполняться параллельно.

  1. сильный (под управлением ios4 = удерживать ) - он говорит: "Держите это в куче, пока я больше не укажу на это" - другими словами, " Я владелец, вы не можете освободить это перед целью штрафа с тем же, что и сохранить" -Вам использовать только если вы хотите сохранить объект. - По умолчанию все переменные экземпляра и локальные переменные являются сильными указателями. - Мы обычно используем strong для uiviewcontrollers (родители элемента пользовательского интерфейса) - strong используется с ARC, и это в основном помогает вам, не беспокоясь о сохранении количества объекта. ДУГА автоматически освобождает его для вас, когда вы закончите с ним.Использование ключевого слова strong означает, что объект принадлежит вам.

пример:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;
  1. слабый (под управлением ios4 = unsafe_unretained ) - он говорит: "Держите это, пока кто-то другой указывает на это сильно" - то же самое, что назначить, не сохранить или освободить - "Слабая" ссылка-это ссылка, которую вы не сохраняете. - Мы обычно используем слабый для IBOutlets (детей UIViewController).Эта работа потому что дочерний объект только должен существовать до тех пор, пока существует родительский объект. - слабая ссылка-это ссылка, которая не защищает ссылочный объект от сбора сборщиком мусора. - Слабое-это, по сути, присвоенное, незапятнанное свойство. Кроме того, когда объект освобожден, слабый указатель автоматически устанавливается в nil

пример :

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

Сильное И Слабое Объяснение,благодаря BJ Гомер!--45-->:

представьте, что наш объект-это собака, и что собака хочет убежать (освобождаться). Сильные указатели как поводок на собаке. Пока у вас есть поводок, прикрепленный к собаке, собака не убежит. Если пять человек прикрепляют свой поводок к одной собаке (пять сильных указателей на один объект), то собака не убежит, пока все пять поводков не будут отсоединены. Слабые указатели, с другой стороны, похожи на маленьких детей, указывающих на собаку и говорящих: "Смотри! Ля собака!- Пока собака на поводке, малыши могут видеть ее и указывать на нее. Как только все поводки отстегиваются, собака убегает, независимо от того, сколько маленьких детей указывают на нее. Как только последний сильный указатель (поводок) больше не указывает на объект, объект будет освобожден, а все слабые указатели будут обнулены. Когда мы используем слабых? Единственное время, когда вы хотите использовать слабый, - это если вы хотите избежать циклов сохранения (например, родитель сохраняет ребенка, а ребенок сохраняет родителя, поэтому ни один из них никогда не освобождается).

  1. сохранить = сильный - он сохраняется, старое значение освобождается и назначается - сохранить указывает, что новое значение должно быть отправлено-сохранить при назначении и старое значение отправлено-выпуск - удержание - это то же самое, что и сила. - apple говорит, что если вы напишете, он будет автоматически преобразован/работать только как сильный. - такие методы, как" alloc", включают неявное "сохранить"

пример:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. присвоить -назначить по умолчанию и просто выполняет присваивание переменной - assign-это атрибут свойства, который сообщает компилятору, как синтезировать реализацию сеттера свойства -Я бы использовал assign for C примитивные свойства и слабые для слабых ссылок на Objective-C объекты.

пример:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. unsafe_unretained

    -unsafe_unretained-это квалификатор владения, который сообщает ARC, как вставлять вызовы retain/release - unsafe_unretained-это версия Arc assign.

пример:

@property (nonatomic, unsafe_unretained) NSString *nickName;

@synthesize nickName;
  1. скопировать - копирование требуется, когда объект является изменяемым. - copy указывает, что новое значение должно быть отправлено-copy по назначению и старое значение sent-release. - copy is like retain возвращает объект, который вы должны явно освободить (например, в dealloc) в средах, не собранных мусором. - если вы используете copy, вам все равно нужно выпустить это в dealloc. - Используйте это, если вам нужно значение объекта, как это в данный момент, и вы не хотите, чтобы это значение отражало какие-либо изменения, сделанные другими владельцы объекта. Вам нужно будет освободить объект, когда вы закончите с ним, потому что вы сохранить копия.

пример:

@property (nonatomic, copy) NSArray *myArray;

@synthesize myArray;

атомарное свойство может быть доступно только одним потоком за раз. Это thread safe. Значение по умолчанию-atomic .Обратите внимание, что нет ключевого слова atomic

Неатомической означает, что несколько потоков могут получить доступ к элементу .Это поток небезопасных

поэтому при использовании atomic следует быть очень осторожным .Как это влияет на производительность вашего кода