Objective-C - 如何隐藏实现协议的类的方法

时间:2012-07-13 12:36:59

标签: objective-c protocols

问题在标题中。代码示例:

UIViewController <MyProtocol> *viewcontroller = ...;

[viewcontroller methodFromProtocol]; // I expect to be able to call all methods that the protocol defines

//UIViewControllerSubclass implements MyProtocol

UIViewControllerSubclass *viewControllerSubclassWithoutMyProtocol = [[UIViewControllerSubclass alloc] init];
[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere]; // I only expect to be able to call the methods that are defined in this class' interface even though this class implements MyProtocol

2 个答案:

答案 0 :(得分:2)

你的问题并不完全清楚,但我想你在问你是否可以“私下”遵守协议?

这可以通过声明您符合实现文件中的协议而不是接口文件来完成。使用视图控制器,您可以在.m文件中自动为您生成的类继续中执行此操作,否则您需要自己添加类继续:

@interface MyVCSubclass () <MyProtocol>

现在,任何只导入头文件的类都不会知道你的控制器是否符合协议。

答案 1 :(得分:2)

  

[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere];

     

我只希望能够调用此类接口中定义的方法,即使这个类实现了MyProtocol

这是一个糟糕的期望。 Objective-C允许您调用对象实现的任何方法。如果您尝试调用对象未实现的方法,则应该发生两件事:

  • 您收到编译器警告(但不是错误)
  • 当代码运行时,它会崩溃,除非您已采取措施处理此类事件。

如果一个类实现了一个协议但没有声明它在公共头中这样做,那么你仍然可以调用该方法(因为Objective C没有私有方法)。我原以为你会收到一个编译器警告,但如果你从同一个Xcode项目中的文件中调用它作为你的对象(也就是你没有构建一个静态库)那么Xcode可能是变得聪明并决定由于该方法存在,因此必须可以调用。

从您的问题中不清楚您预期会发生什么以及实际发生了什么。如果您提供该信息,我们将能够提供更好的答案。