1

我的问题可能看起来很奇怪,但是我想了解 Stackers 的想法,在我的工作中,我只是注意到每个协议始终都符合一个类,我想知道是否有可能使一个简单的对象也符合协议,如果不是(而且几乎不是),为什么不呢?

感谢您的关心

4

2 回答 2

1

协议一致性有两个部分:

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

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

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

于 2013-02-18T09:57:26.850 回答
0

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

于 2013-02-18T19:57:32.350 回答