Вы всегда могли объявить @property
в категории.То, что вы не могли сделать - и все еще не можете - это объявить хранилище для свойства в категории, ни в качестве переменной экземпляра, ни через `@synthesize.
Однако ....
@interface MyClass ()
- это , а не категория .Это расширение класса и имеет явно более специфическую роль, чем категория.
А именно, расширение класса может использоваться для расширения @ interface класса, и это включает в себя @properties, которые могутбыть @synthesized (включая синтезирование хранилища в современной среде выполнения).
Foo.h:
@interface Foo
@end
Foo.m:
@interface Foo()
@property int x;
@end
@implementation Foo
@synthesize x; // synthesizes methods & storage
@end
он просто использует ассоциативное хранилище за кулисами, чтобы сделать эту работу?
Нет -это реальная переменная экземпляра.Современная среда выполнения устраняет проблему хрупкого базового класса.
@interface MyClass ()
NSInteger foobar;
- (void) someCategorizedMethod;
@end
Выше не работает (как и ожидалось), потому что foobar
, по сути, является глобальной переменной.
Если вы измените его на:
@interface MyClass () {
NSInteger foobar;
}
- (void) someCategorizedMethod;
@end
Тогдаон будет работать с последней версией компилятора llvm (с правильными флагами, как указано @Joshua в комментарии).