问题在标题中。代码示例:
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
答案 0 :(得分:2)
你的问题并不完全清楚,但我想你在问你是否可以“私下”遵守协议?
这可以通过声明您符合实现文件中的协议而不是接口文件来完成。使用视图控制器,您可以在.m文件中自动为您生成的类继续中执行此操作,否则您需要自己添加类继续:
@interface MyVCSubclass () <MyProtocol>
现在,任何只导入头文件的类都不会知道你的控制器是否符合协议。
答案 1 :(得分:2)
[viewControllerSubclassWithoutMyProtocol methodThatIsNotInTheInterfaceIsDisplayedHere];
我只希望能够调用此类接口中定义的方法,即使这个类实现了MyProtocol
这是一个糟糕的期望。 Objective-C允许您调用对象实现的任何方法。如果您尝试调用对象未实现的方法,则应该发生两件事:
如果一个类实现了一个协议但没有声明它在公共头中这样做,那么你仍然可以调用该方法(因为Objective C没有私有方法)。我原以为你会收到一个编译器警告,但如果你从同一个Xcode项目中的文件中调用它作为你的对象(也就是你没有构建一个静态库)那么Xcode可能是变得聪明并决定由于该方法存在,因此必须可以调用。
从您的问题中不清楚您预期会发生什么以及实际发生了什么。如果您提供该信息,我们将能够提供更好的答案。