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



我正在为方法寻找类似于@protected的东西。@protected似乎只适用于@properties(setter和getter)。对于常规方法,是否也有获得类似行为的方法?

根据您的评论,我认为您在谈论对编译器的隐藏。这确实是可能的,但可能有点麻烦。另一方面,从运行时隐藏是不可能的,不管怎样,如果有人真的想访问您的方法,他们会的。

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

#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的设置是为了支持组合和委派而不是继承。若你们发现自己工作太辛苦了,那个么你们可能是在逆流而上。

既不能声明受保护的方法,也不能声明私有方法。声明上面提到的方法"private"只是伪造的,并没有真的停止任何事情。Objective-C的动态特性使得它不可能以实现对方法的访问控制。(你可以重拳出击修改编译器或运行时,速度会受到严重影响,但没有这样做的明显原因。)

来源:

Objective-C 中的受保护方法

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

显然,您可以通过一些变通方法来模拟此功能,但我怀疑这是否是一种好的风格。

最新更新