如何覆盖超类的私有属性的getter方法

时间:2018-05-13 13:07:27

标签: ios objective-c

通常,我们可以使用以下代码为属性设置getter方法。

- (UIButton *)aButton {
    if (!_aButton) {
        _aButton = [UIButton buttonWithType:UIButtonTypeCustom];
    }
    return _aButton;
}

现在,该属性在超类的.m文件中声明 所以。
问题:如何在子类中执行此操作?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以简单地在类别标头中的超类中声明私有方法的存在,然后使用它们。您不能直接从超类中分配私有实例变量,除了使用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

但是,通常这些属性是出于某种原因而私下宣布的。它们随每个版本等而变化,您的代码将来很容易破解。即使只是你自己的类,程序员改变超类中的代码可能也不会意识到项目中有另一个类覆盖它,并且很容易做出重大改变。

通常,做这样的事情的唯一原因是单元测试,临时调试代码,或两个密切相关的类,其他类应该知道私有/包私有方法,而不是任何其他类 - 否则超类应该只是在公共头中声明它们。即使在后一种情况下,它可能是有意义的做出“SuperclassPrivate.h”或“SuperclassProtected.h”头申报的方法/其它相关的类(如UIGestureRecognizerSubclass.h),使得某些其他类可以导入使用的属性标题,而不是公开的一般用途。如果你选择这条路线,最好在超类中添加注释,指出还有另一个类覆盖了有问题的属性。