使用EXC_BAD_ACCESS委托崩溃

Mar*_*cin 3 delegates objective-c ios

我有代表

@property (nonatomic, assign) id <DelegateProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)

但它在performSelector上崩溃了

if (_delegate != nil && [_delegate conformsToProtocol:@protocol(DelegateProtocol)])
{
    NSObject *obj = _delegate;
//HERE IS EXC_BAD_ACCESS
    [obj performSelectorOnMainThread:@selector(didTouchImageView:) withObject:self waitUntilDone:NO];
}
Run Code Online (Sandbox Code Playgroud)

我在这里设置代表:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [invoiceTabImage setDelegate:self];
}
Run Code Online (Sandbox Code Playgroud)

问题是为什么会这样.

ser*_*gio 5

EXC_BAD_ACCESS意味着你的代理在发送消息时已被解除分配didTouchImageView(我假设你发送消息时一切正常performSelector,那就太容易了).

首先,检查您的代理人的保留/发布管理,看看是否有任何错误.

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

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

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

编辑:

两个提示:

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

  2. 在你的控制器中dealloc,添加以下行:

    invoiceTabImage = nil;

    这样你就可以确保在删除控制器/委托时,委托对象知道委托不再存在; 该程序将无法正常工作,但可能不会崩溃.