objective-c - id 确认了一个协议(protocol),但是在哪里实现呢?

标签 objective-c ios protocols

这可能是一个天真的问题,但我感觉有点迷茫。我在 Apple Documentation 阅读了有关协议(protocol)的 iOS 开发人员指南。 ,但没有完全说得通。让我用最短的方式解释我的困境。

假设我有如下协议(protocol),

@protocol MyProtocol<NSObject>
- (void)someMessage;
@end

在我的代码中,我声明了这样一个变量,

id<MyProtocol> someVar;

到目前为止一切顺利,但是 someVar 是一个 id 类型,所以我们将在哪里实现 -(void) someMessage;?


NOTE: I have knowledge such as, Implementation of defined functions of interface should be inside a Class which implements that interface. This understanding is from Java so, and in Java it is very apparent to know which object is from which class and what interface that class implements. But above Objective C way just confused me :(.


最佳答案

当你写的时候:

id<MyProtocol> someVar

您只是声明“someVar”将是任何类的对象,但此类将遵守协议(protocol) MyProtocol。

所以你的代码中会有一些点会实例化someVar。此时 someVar 将关联到一个类。此类必须满足 MyObject 协议(protocol)。 请注意,编译器会尽力在出现问题时向您发出警告,例如如果您将此对象转换为某个不遵守协议(protocol)的类,例如假设您的协议(protocol)定义了一个名为“protocolMethod”的方法,那么:

[(NSArray *)someVar protocolMethod]

将生成一个编译器警告(“NSArray 可能不响应 protocolMethod”)。

当然,您永远不会受到运行时错误的保护:因此,如果在运行时您将 someVar 创建为不满足协议(protocol)的类,那么对协议(protocol)方法的任何调用都会引发异常。

关于objective-c - id 确认了一个协议(protocol),但是在哪里实现呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7634394/

相关文章:

objective-c - 点击手势事件未在UIImageView上触发

ios - 类型 skproduct 的无效转换类型 nsmutablearray - ios

objective-c - 我应该在 Obj-C 中将所有原始数据类型初始化为 'safe' 值吗?

ios - UIStackView - 拖动以重新排列排列的 subview ?

swift - 使用观察者模式设置委托(delegate)时遇到问题

swift - 使用泛型和协议(protocol)作为类型参数的区别,在函数中实现它们的优缺点是什么

ios - 安装 xcode 5 : value for key (UIHighlighted) is not a boolean 后出错

ios - 管理从普通 NavigationBar 到透明 NavigationBar 的转换

ios - 更改 View Controller 时,新 Controller 出现,但几乎立即消失

swift - 为什么我可以将 @objc 协议(protocol)声明为弱属性,而不是 swift 协议(protocol)?