Что такое категории и расширения классов?
Категория (category)
@interface NSString (Validation) — добавляет методы к существующему классу без наследования, в том числе к системному и к тому, чьих исходников у вас нет. Методы категории попадают в таблицу методов класса при загрузке и видны всем экземплярам.
Ограничения и ловушки:
- Нельзя добавить ivar;
@propertyв категории объявит только аксессоры, а хранить придётся через associated objects. - Если категория объявляет метод, который уже есть в классе, она его заменяет, причём какая из двух категорий победит — не определено. Поэтому методы категорий принято префиксовать (
ds_trimmed). - Категория не может вызвать «оригинал» — для этого есть swizzling.
- Методы категории из статической библиотеки могут не долинковаться без
-ObjC/-all_load.
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (Tag)
@property (nonatomic, copy) NSString *ds_tag;
@end
@implementation NSObject (Tag)
static char kTagKey;
- (NSString *)ds_tag {
return objc_getAssociatedObject(self, &kTagKey);
}
- (void)setDs_tag:(NSString *)tag {
objc_setAssociatedObject(self, &kTagKey, tag,
OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep