作为自己的委托的类是否遵循iOS约定?
对不起,这个问题可能听起来“主观”,但我认为应该有一个非常确定的答案。 我有一个“LocationManager”类,我想管理我的核心位置逻辑。 我有两个选择:
-
LocationManager具有引用CLLocationManager实例的强属性。 LocationManager是CLLocationManager的委托,并从中接收位置更新。
-
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是对的,有时可以将另一个类的子类设置为自己的委托。 虽然您需要注意该对象如何响应某些消息。