是否有可能使NSObject符合协议?如果它,怎么样? - 认真对待

时间:2013-02-18 09:48:12

标签: ios objective-c macos protocols nsobject

我的问题可能看起来很奇怪,但我想围绕Stackers的想法得到这个想法,在我的工作中我只是注意到每个协议都是由类一直遵守,我想知道是否有可能使一个简单的对象符合对于协议,如果不是(几乎没有),为什么不呢?

感谢您的关注

2 个答案:

答案 0 :(得分:1)

协议一致性分为两部分:

  • 对象必须响应协议定义中的所需消息
  • 当被问及对象是否符合协议
  • 时,对象必须返回YES

那么,我们可以安排一个NSObject的实例来满足这两个条件吗?是。事实上,至少有两种方法可以做到这一点。首先,让{em>所有实例NSObject符合协议。我们所做的是在NSObject上的类别中定义协议方法,这解决了第一部分。然后我们“swizzle”(这意味着使用class_replaceMethod()运行时函数)-[NSObject conformsToProtocol:],返回YES作为我们有趣的协议。

现在让我们假设您希望NSObject特定实例符合协议。这稍微容易一些。首先,创建一个符合协议并实现所需方法的NSObject子类;没有必要覆盖-conformsToProtocol:,因为运行时库可以看到此类符合。现在,在运行时,使用NSObject实例并调用object_setClass()将其类切换到符合要求的子类。

答案 1 :(得分:0)

您可以使用运行时函数class_addProtocol()在运行时向类添加协议。但是,当类没有实现协议的所有方法时,这样做可能会导致不良结果。