在Objective-C中,如何从除子类之外的所有人隐藏方法(而不是属性)

时间:2013-02-17 16:59:57

标签: objective-c

我正在为方法寻找类似于@protected的东西。 @protected似乎仅适用于@properties(设置者和获取者)。是否有办法为常规方法获得类似的行为?

4 个答案:

答案 0 :(得分:4)

根据您的评论,我假设您正在谈论隐藏编译器。这确实是可能的,但可能有点麻烦。另一方面,如果有人真的希望访问您的方法,那么隐藏在运行时是不可能的。他们会。

要隐藏编译器,您应该在单独的头文件中定义类扩展名,如下所示:

#import "MyClass.h"

@interface MyClass ()

@property (nonatomic, strong) NSObject* protectedObject;
-(void) protectedMethod;

@end

您可以调用标题MyClass + Internal.h,如果您正在构建库,set the header visibility to private

现在您要做的就是在子类实现文件中导入您的私有标头(或者您可能希望在内部使用这些方法的地方)

答案 1 :(得分:0)

Objective-C中没有按方法访问控制。

您可以将API拆分为多个类别,并将它们放入不同的头文件中,以实现某种咨询访问控制。

答案 2 :(得分:0)

我已经看到这是通过.h文件中的命名(而不是匿名)类别在野外实现的:

//MyClass.h:

@interface MyClass : NSObject
  /*Public stuff...*/
@end


@interface MyClass (protected)
  /*Protected stuff...*/
@end

但正如其他人所提到的,这个命名类别实际上只是提供一些提示的一种方式 - 而且依赖开发人员查看.h文件而不是文档。它没有做任何神奇的事情,也没有实现任何真正的访问控制。

同样关于ObjC中受保护方法的主题,请记住,Cocoa设置为支持组合和委托而不是继承。如果你发现自己工作太辛苦,你可能正在游泳。

答案 3 :(得分:-1)

  

您既不能声明受保护的私有方法。宣布一个   如上所述,“私人”方法只是伪造,而不是   真的停止了什么。 Objective-C的动态性使其无法实现   实现方法的访问控制。 (你可以大量地做到这一点   以严重的速度惩罚修改编译器或运行时,但是   明显的原因没有这样做。)

来源:

Protected methods in Objective-C

http://objectmix.com/c/177901-methods-access-modifiers-objective-c.html

你可以通过一些解决方法显然模拟这个功能,但我怀疑这是好的风格。