【问题标题】:Check if there is a delegate listening? [duplicate]检查是否有委托人在听? [复制]
【发布时间】:2013-05-03 15:34:23
【问题描述】:

我有一个类将委托消息发送到另一个类。 如果其他班级没有在听,则应用程序崩溃。 在我发送消息之前,我正在寻找一种方法来检查其他班级是否正在收听。

所以在发布委托的班级中,我有这个条件检查:

       if ([self.delegate respondsToSelector:@selector(NewDataFromSocketWithString:WithCommand:)])
           [self.delegate NewDataFromSocketWithString:final WithCommand:c];

在某种程度上,条件总是为真,即使获得委托的类已经被释放并且不再存在。

我如何在发帖前检查代理以消除崩溃?

【问题讨论】:

  • 您的问题似乎是您使用的是伪造的委托指针,而不是委托没有“响应”。您需要确保保留委托对象,或者确保在对象被销毁时将指针设置为零。

标签: objective-c


【解决方案1】:

即使获取委托的类已经被释放并且不再存在。

...您是否测试过这种情况?如果您不是弱引用您的代表,那么这将不会发生。如果委托实际上已被释放,那么self.delegate 应该返回nil,这意味着您的 if 语句将评估为 false。

您的 if 语句评估为 true 的事实向我表明您的委托仍然设置。您是使用 ARC 还是手动管理内存?如果是后者,您需要将您的属性设置为assign - 如果是前者,您需要将您的委托设置为weak

【讨论】:

  • 我不使用 ARC,我唯一想收听消息的地方是:socketInstance.delegate=self;在相关的班级。稍后,这个类被替换(它的一个主视图)。我还应该对委托本身做些什么来释放它?
  • @Rant 你应该使用 ARC。但是,如果没有,那么您需要在释放委托对象时手动将委托设置为nil。 ARC 下的weak 解决了这个问题。如果您将delegate 设为retain 属性,那么您可能会有一个保留周期。
  • 在2013年使用ARC是一个不错的主意,我猜,为什么不用呢?
  • @SergiusGee 你说得对,但我使用 Xcode 2 年没有它,今天我只是害怕学习它的所有规则,所以我只是牛排到非弧。
  • 我知道这是一个旧线程,但这就像说我已经习惯了我的 iPhone 1,我不会打扰 2、3、4、5 和即将推出的 6。永远与时俱进!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2014-04-09
  • 2015-07-23
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多