Как безопасно объявлять и использовать переменные экземпляра (instance variables) в Objective-C?

«Как безопасно объявлять и использовать переменные экземпляра (instance variables) в Objective-C?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Безопасность достигается через корректное использование свойств (@property) вместо прямого доступа к переменным экземпляра (ivars).

Рекомендуемый подход:

@interface MyClass : NSObject
// Объявление свойств обеспечивает инкапсуляцию и управление памятью.
@property (nonatomic, strong) NSString *name;
@property (atomic, copy) NSArray *items;
@end

Преимущества использования @property:

  1. Управление памятью: Автоматические retain/release/сopy (атрибуты strong, weak, copy).
  2. Потокобезопасность: Свойство atomic (по умолчанию) обеспечивает атомарность геттера/сеттера.
  3. Кастомизация: Возможность переопределения сеттеров и геттеров.
  4. KVO/KVC: Поддержка технологий наблюдения и кодирования.

Когда допустим прямой доступ к ivars (_variable):

  • В методах init и dealloc (во избежание побочных эффектов от KVO/кастомных сеттеров).
  • В критичных по производительности участках кода (после профилирования).
  • В реализациях геттеров/сеттеров самого свойства.

Для многопоточности:

  • Используйте atomic свойства для простых случаев.
  • Для сложной синхронизации применяйте dispatch_queue, @synchronized или другие примитивы, даже с nonatomic свойствами.