我正在寻找类似于@protected
for 方法的东西。@protected
似乎只适用于@properties
(setter 和 getter)。有没有办法让常规方法也有类似的行为?
4 回答
根据您的评论,我假设您正在谈论从编译器中隐藏。这确实是可能的,但可能有点麻烦。另一方面,从运行时隐藏是不可能的,如果有人真的想访问您的方法,他们会的。
要对编译器隐藏,您应该在单独的头文件中定义一个类扩展,如下所示:
#import "MyClass.h"
@interface MyClass ()
@property (nonatomic, strong) NSObject* protectedObject;
-(void) protectedMethod;
@end
您可以调用标题 MyClass+Internal.h 如果您正在构建库,请将标题可见性设置为私有
现在你所要做的就是在子类实现文件中导入你的私有头文件(或者你可能想要在内部使用这些方法的任何地方)
Objective-C 中没有每个方法的访问控制。
您可以将 API 拆分为多个类别,并将它们放入不同的头文件中,以实现某种咨询访问控制。
我已经看到通过 .h 文件中的命名(而不是匿名)类别在野外实现了这一点:
//MyClass.h:
@interface MyClass : NSObject
/*Public stuff...*/
@end
@interface MyClass (protected)
/*Protected stuff...*/
@end
但正如其他人所提到的,这个命名类别实际上只是提供一点提示的一种方式——它依赖于开发人员查看 .h 文件而不是文档。它没有做任何神奇的事情,也没有实现任何真正的访问控制。
同样关于 ObjC 中的受保护方法的主题,请记住 Cocoa 设置为支持组合和委托而不是继承。如果你发现自己工作太努力,你可能会逆流而上。
您既不能声明受保护的方法,也不能声明私有的方法。如上所述,将方法声明为“私有”只是伪造,并不能真正阻止任何事情。Objective-C 的动态特性使得实现方法的访问控制成为不可能。(您可以通过大量修改编译器或运行时来做到这一点,但会严重影响速度,但由于明显的原因,这没有完成。)
来源:
http://objectmix.com/c/177901-methods-access-modifiers-objective-c.html
您显然可以通过一些变通方法来模拟此功能,但我怀疑这是一种好的风格。