根据一些官方说法,Objective-C 中的类应该只在其 header 中公开公共(public)方法和属性:
@interface MyClass : NSObject
@property (nonatomic, strong) MyPublicObject *publicObject;
- (void)publicMethod;
@end
私有(private)方法/属性应该保存在 .m 文件的类扩展中:
@interface MyClass()
@property (nonatomic, strong) MyPrivateObject *privateObject;
- (void) privateMethod;
@end
而且我认为对于私有(private)但可从子类访问的事物没有protected
类型。我想知道,除了公开声明私有(private)属性/方法之外,还有什么办法可以实现这一目标吗?
最佳答案
解决这个问题的一种方法是在子类的类扩展中重新声明该属性,然后添加一个 @dynamic
语句,这样编译器就不会创建该属性的重写实现。所以像这样:
@interface SuperClass ()
@property (nonatomic, strong) id someProperty;
@end
....
@interface SubClass ()
@property (nonatomic, strong) id someProperty;
@end
@implementation SubClass
@dynamic someProperty;
@end
这显然不理想,因为它复制了一个私有(private)可见的声明。但它在某些情况下非常方便和有帮助,所以我会根据具体情况评估这种复制与在公共(public)界面中公开属性所涉及的危险。
Apple 在 UIGestureRecognizer 中使用的另一种方法是在单独的类别头文件中声明该属性,明确命名为“私有(private)”或“ protected ”,例如“SomeClass+Protected.h”。这样,其他程序员就会知道他们不应该导入该文件。但是,如果您不控制您继承自的代码,那不是一个选择。
关于objective-c - 将私有(private) Objective-C 方法或属性公开给子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12633627/