В чем разница между атомарными и неатомарными атрибутами?

Что означают atomic и nonatomic в декларациях свойств?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

Какая оперативная разница между этими тремя?

вопрос задан 26.02.2009
Alex Wayne
102453 репутация

27 ответов


  • 52 рейтинг

    Атомный:

    Atomic гарантирует, что доступ к свойству будет осуществляться атомарным способом. E. г. он всегда возвращает полностью инициализированные объекты, любое получение / установка свойства в одном потоке должно завершиться, прежде чем другой сможет получить к нему доступ.

    Если вы представите следующую функцию, выполняющуюся одновременно в двух потоках, вы поймете, почему результаты не будут хорошими.

    -(void) setName:(NSString*)string
    {
      if (name)
      {
        [name release]; 
        // what happens if the second thread jumps in now !?
        // name may be deleted, but our 'name' variable is still set!
        name = nil;
      }
    
      ...
    }
    

    Плюсы: Возврат полностью инициализированных объектов каждый раз делает его лучшим выбором в случае многопоточности.

    Минусы: Хит производительности, делает выполнение немного медленнее

    Неатомный:

    В отличие от Atomic, он не гарантирует, что каждый раз полностью инициализированный объект возвращается.

    Плюсы: Чрезвычайно быстрое исполнение.

    Минусы: Возможны значения мусора в случае многопоточности.

    ответ дан Andrew Grant, с репутацией 49768, 26.02.2009
  • 52 рейтинг

    Самый простой ответ: нет разницы между вашими вторыми двумя примерами. По умолчанию средства доступа к свойствам являются атомарными.

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

    См. Раздел « Производительность и многопоточность » в Apple Objective-C 2. 0 документация для получения дополнительной информации и для других соображений при создании многопоточных приложений.

    ответ дан Jay O'Conor, с репутацией 2395, 26.02.2009