Почему мы не используем strong для enum в Objective-C?
Суть
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