0

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

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
4

2 回答 2

2

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

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

@interface MyVCSubclass () <MyProtocol>

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

于 2012-07-13T13:05:42.360 回答
2

[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere];

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

这是一个不好的期望。Objective-C 允许您调用对象实现的任何方法。如果你试图调用一个对象没有实现的方法,应该会发生两件事:

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

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

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

于 2012-07-13T13:16:06.333 回答