我有代表
@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];
}
问题是为什么会这样。
答案 0 :(得分:5)
EXC_BAD_ACCESS
表示您的委托已经在发送消息didTouchImageView
时已取消分配(我假设您发送消息performSelector
时一切正常,这太简单了)
首先,检查代理人的保留/发布管理,看看是否有不正确的内容。
如果一切正常,那么调试它的一种可能性就是启用Zombies(你可以通过Instruments / Run with performance tool,或者在调试时设置环境变量)。
这可以帮助您检测问题的原因。
如果您需要更多帮助,请发布有关如何创建/保留/释放您的委托对象的代码,并粘贴崩溃的堆栈跟踪。
编辑:
两个提示:
与代表合作的关键(不保留它们)是确保视图控制器(在您的情况下也是委托)长于invoiceTabImage
;然后,您可以查看invoiceTabImage
的生命周期(创建/发布时)并将其与代表进行比较;
dealloc
中,添加以下行:
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];
}
}
}