Вы можете просто объявить о существовании частных методов в суперклассе в заголовке категории, а затем использовать их.Вы не можете назначить частную переменную экземпляра напрямую из суперкласса, кроме как с помощью setValue: forKey: или других функций времени выполнения, таких как object_setIvar ().
@interface Superclass (PrivateDecls)
@property (nonatomic, strong) UIButton *aButton;
@end
@implementation Subclass
...
- (UIButton *)aButton {
UIButton *button = [super aButton];
if (!button) {
button = [UIButton buttonWithType:UIButtonTypeCustom];
[super setAButton:button];
}
return button;
}
@end
Однако обычно такие свойства объявляются в частном порядке по причине.Они могут изменяться с каждым выпуском и т. Д., И ваш код может легко сломаться в будущем.Даже если ваши собственные классы изменяются, программист, изменяющий код в суперклассе, может не знать, что в проекте есть другой класс, переопределяющий его, и может легко внести критические изменения.
Обычно единственная причина для этоготакие вещи предназначены для модульных тестов, временного кода отладки или для двух тесно связанных классов, где только другой класс должен знать о закрытых методах private / package, а не о любом другом классе - в противном случае суперкласс должен просто объявить их в открытом доступе.заголовок.Даже в этой последней ситуации может иметь смысл создать заголовок «SuperclassPrivate.h» или «SuperclassProtected.h» для объявления методов / свойств, используемых другими связанными классами (такими как UIGestureRecognizerSubclass.h), чтобы некоторые другие классы могли импортировать этотзаголовок, не будучи публичным для общего пользования.Если вы пойдете по этому пути, может быть лучше добавить комментарии в суперкласс, чтобы указать, что есть другой класс, переопределяющий рассматриваемое свойство.