DevPrep

Все темы › Objective-C

Почему мы не используем strong для enum в Objective-C?

Junior PRO

Суть

strong, weak, copy — атрибуты владения, они описывают, как свойство удерживает объект (указатель на кучу с подсчётом ссылок). enum в Objective-C — обычное целое число C (NSInteger/NSUInteger через NS_ENUM/NS_OPTIONS): оно хранится прямо в ivar, у него нет retain count и нечего удерживать. То же относится к BOOL, CGFloat, NSTimeInterval, структурам (CGRect), SEL, C-указателям.

Для таких свойств атрибут владения — assign (он же по умолчанию для не-объектов; явно пишут ради читаемости):

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, LoadState) {
    LoadStateIdle,
    LoadStateLoading,
    LoadStateFailed,
};

@interface Loader : NSObject
@property (nonatomic, assign) LoadState state;      // скаляр
@property (nonatomic, assign) CGFloat progress;
@property (nonatomic, strong) NSError *lastError;   // объект
@end

Если написать strong для enum, компилятор выдаст ошибку «property with 'retain (or strong)' attribute must be of object type».

Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.

Полный ответ — в DevPrep

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store