调用委托方法,无法识别的选择器,因为发送到错误的对象

时间:2011-12-03 18:27:05

标签: objective-c ios memory

在我的应用中,我做了很多网络加载。我的数据模型由“Loader”对象组成,这些对象执行此加载并在完成/失败时调用其委托。代表都遵循“LoaderDelegate”协议。

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

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

我坚持如何确定这个问题的真正原因。

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

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

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

我的所有加载器的委托属性是一个assign属性,但是当加载器完成时委托总是处于活动状态(委托是我的视图控制器调用加载器)。

2 个答案:

答案 0 :(得分:4)

请发布一些代码,因为很难排除故障。记得在dealloc中取消你的代表。

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

除此之外,委托应该是一个不保留的分配财产 - 但这不是你的情况下的问题。

@property (assign) id<TheMightyDelegate> delegate;

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

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

希望这会对你的问题有所了解。如果没有,请提供一些代码。

答案 1 :(得分:2)

原来我在整个地方随机地收到了这个错误,只是没有在这个特定的类中,而不仅仅是委托方法。

就我而言,问题是我在多个线程中访问各种类的属性,而这些属性是非原子的。由于我修复了(删除了属性的非原子属性),我还没有看到这种情况发生。