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)
问题是为什么会这样.
EXC_BAD_ACCESS意味着你的代理在发送消息时已被解除分配didTouchImageView(我假设你发送消息时一切正常performSelector,那就太容易了).
首先,检查您的代理人的保留/发布管理,看看是否有任何错误.
如果一切正常,调试它的一种可能性是启用Zombies(您可以通过Instruments/Run with performance tool,或通过在调试时设置环境变量).
这可以帮助您检测问题的原因.
如果您需要更多帮助,请发布有关如何创建/保留/释放委托对象的代码,并粘贴崩溃的堆栈跟踪.
编辑:
两个提示:
与代表合作的关键(不保留它们)是确保视图控制器(在您的情况下也是代理人)的寿命比invoiceTabImage; 然后,您可以查看invoiceTabImage生命周期(创建/发布时)并将其与代理进行比较;
在你的控制器中dealloc,添加以下行:
invoiceTabImage = nil;
这样你就可以确保在删除控制器/委托时,委托对象知道委托不再存在; 该程序将无法正常工作,但可能不会崩溃.
| 归档时间: |
|
| 查看次数: |
7745 次 |
| 最近记录: |