使用EXC_BAD_ACCESS委托崩溃

时间:2011-07-14 21:07:03

标签: objective-c ios delegates

我有代表

@property (nonatomic, assign) id <DelegateProtocol> delegate;

但是它在performSelector

上崩溃了
if (_delegate != nil && [_delegate conformsToProtocol:@protocol(DelegateProtocol)])
{
    NSObject *obj = _delegate;
//HERE IS EXC_BAD_ACCESS
    [obj performSelectorOnMainThread:@selector(didTouchImageView:) withObject:self waitUntilDone:NO];
}

我在这里设置了代表:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [invoiceTabImage setDelegate:self];
}

问题是为什么会这样。

2 个答案:

答案 0 :(得分:5)

EXC_BAD_ACCESS表示您的委托已经在发送消息didTouchImageView时已取消分配(我假设您发送消息performSelector时一切正常,这太简单了)

首先,检查代理人的保留/发布管理,看看是否有不正确的内容。

如果一切正常,那么调试它的一种可能性就是启用Zombies(你可以通过Instruments / Run with performance tool,或者在调试时设置环境变量)。

这可以帮助您检测问题的原因。

如果您需要更多帮助,请发布有关如何创建/保留/释放您的委托对象的代码,并粘贴崩溃的堆栈跟踪。

编辑:

两个提示:

  1. 与代表合作的关键(不保留它们)是确保视图控制器(在您的情况下也是委托)长于invoiceTabImage;然后,您可以查看invoiceTabImage的生命周期(创建/发布时)并将其与代表进行比较;

  2. 在控制器dealloc
  3. ,添加以下行:

    invoiceTabImage = nil;

    这样您就可以确保在删除控制器/委托时,委派对象知道该委托不再存在;该程序不起作用,但可能不会崩溃。

答案 1 :(得分:1)

检查它是否设置为nil(dealloc将执行此操作)。

这解决了我的问题:

- (void)setDelegate:(id<UITableViewDelegate>)newDelegate
    {
        if (newDelegate!=nil) {
            if (newDelegate != self.collapseDelegate)
            {
                self.collapseDelegate = newDelegate;
                [super setDelegate:self.collapseDelegate?self:nil];
            }
        }
    }