作为自己的委托的类是否遵循iOS约定?

对不起,这个问题可能听起来“主观”,但我认为应该有一个非常确定的答案。 我有一个“LocationManager”类,我想管理我的核心位置逻辑。 我有两个选择:

  1. LocationManager具有引用CLLocationManager实例的强属性。 LocationManager是CLLocationManager的委托,并从中接收位置更新。

  2. LocationManager是CLLocationManager的子类,并且表示self.delegate = self,以便它可以接收自己的位置更新。

我很好奇这些选项中的哪一个被认为是“正确”的事情,我敢肯定必须有一个首选方式。 谢谢!

不应该对CLLocationManager进行子类化并将其委托设置为self,因为它违反了CLLocationManager的约定。 由于该类目前已定义,因此它具有delegate属性。 此属性用作合同,声明您可以将此属性设置为其他对象,并且此对象将接收委托通知。 如果你MyLocationManager CLLocationManager (让我们称之为MyLocationManager ),并且如果对象的delegate属性指向它自己,那么你很可能会创建一个情况,如果用户没有为自己的目的使用delegate属性, MyLocationManager只能按照承诺的方式工作。 从用户的角度来看, MyLocationManager是一个没有可用delegate属性的CLLocationManager 。 这违反了Liskovs替代原则 ,顺便说一下 。 这里要问的问题是:如果某个ViewController类决定使用它并让其delegate属性指向自身( ViewController ), MyLocationManager仍然可以工作?

此外,如果你说self.delegate = self ,它不再是“委托”。 所以我想说最好使用变体1。

谢谢你的提问。

是的,你可以毫无问题地做到这一点。 我有一个UITextField的子类,它是自己的委托。

第一个选项对我来说似乎是正确的,因为它对CLLocationManager (#2)的子类没有多大意义。 你会添加什么function? 如果你没有添加任何东西为什么子类?

您关心的只是封装有关位置更新的消息。 我会说你在第一种情况下可以接受使用委托/协议模式。

而Jef是对的,有时可以将另一个类的子类设置为自己的委托。 虽然您需要注意该对象如何响应某些消息。