【问题标题】:Calling delegate method, unrecognized selector because sending to wrong object调用委托方法,无法识别的选择器,因为发送到错误的对象
【发布时间】:2011-12-03 18:27:04
【问题描述】:

在我的应用程序中,我做了很多网络加载。我的数据模型由执行此加载并在完成/失败时调用其委托的“加载器”对象组成。委托都符合“LoaderDelegate”协议。

我遇到的问题是,有时看似随机的对象,而不是委托,正在获取委托消息。这当然会因为无法识别的选择器而导致崩溃。

只有一组崩溃日志告诉我我的哪个加载器有问题,其他的没有该信息,只有收到消息的随机对象。

我不知道如何确定这个问题的真正原因。

一组崩溃日志中有一个加载程序试图调用它的委托,但到达_UIImageViewExtendedStorage。另一个有一个装载机正在到达__NSCFInputStream。另一个__NSBlockVariable__。还有一个,CALayer

这只是我 3 天前的最新测试版。

如果每次都是同一个对象,那将是一回事,但它似乎几乎是随机的。内存是否有可能以某种方式被新对象覆盖?

我的所有加载器的委托属性都是分配属性,但加载器完成时委托始终处于活动状态(委托是调用加载器的视图控制器)。

【问题讨论】:

    标签: objective-c ios memory


    【解决方案1】:

    请发布一些代码,因为很难排除故障。请记住在 dealloc 中将您的委托归零。

    - (void) dealloc {
      objectOfWhichIAmTheDelegate.delegate = nil;
    }
    

    更重要的是,您的委托应该是一个不保留的分配属性 - 但这在您的情况下不是问题。

    @property (assign) id<TheMightyDelegate> delegate;
    

    您应该做的另一件事是确保委托在您触发方法之前响应您要发送给他的选择器。

    if ([delegate respondsToSelector:@selector(yourMethod)]) {
    [delegate performSelector:@selector(yourMethod)];
    }
    

    希望这会对您的问题有所帮助。如果没有,请提供一些代码。

    【讨论】:

    • 我正在使用分配,请参阅我的问题的最后一句话。 ;) 我目前没有在 dealloc 中将委托设置为 nil,所以我会尝试一下。虽然我不确定为什么会导致这个问题,因为加载程序只有在他们的 nsurlconnection 完成并且他们调用他们的代表之后才会被释放。另外,我知道将所有委托调用包装在respondsToSelector 中会阻止崩溃,但我想找出问题的根本原因。为什么委托属性一直指向错误的位置对我来说没有意义。
    • 发布所有内容的代码太多,但为了让您了解结构,我所有的加载器都是从加载器超类继承的。所有加载器的委托属性实际上都在超类中。这可能是问题的一部分吗?
    • 委托的对象需要nilother对象的delegate出口;第一个代码 sn-p 错误地指出一个对象应该nil 它自己的 delegate outlet。 @einsteinx2
    【解决方案2】:

    事实证明,我到处都随机收到此错误,只是不在这个特定的类中,也不只是在委托方法中。

    就我而言,问题原来是我在多个线程中访问各种类的属性,而这些属性是非原子的。自从我解决了这个问题(删除了属性的非原子属性),我再也没有看到这种情况发生了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多