Objective c 发送有效对象消息时EXC_错误访问

Objective c 发送有效对象消息时EXC_错误访问,objective-c,ios,exc-bad-access,ipad-2,Objective C,Ios,Exc Bad Access,Ipad 2,我的主应用程序控制器调用子用户来处理特定的屏幕序列。主控制器将自己设置为子控制器中的代理。当分包商完成其工作时,它会通知代理。偶尔,此通知会因EXC\u BAD\u访问失败 0基于gdb,问题发生在objc_msgSend中。两个寄存器都有一个非零值 gdb: 0x3367cc98 <+0016> ldr r5, [r4, #8] 这是代理端的代码。代理由App_代理保留,因为它是主控制器 - (void) done: (UIViewController *) caller

我的主应用程序控制器调用子用户来处理特定的屏幕序列。主控制器将自己设置为子控制器中的代理。当分包商完成其工作时,它会通知代理。偶尔,此通知会因EXC\u BAD\u访问失败

0基于gdb,问题发生在objc_msgSend中。两个寄存器都有一个非零值

gdb: 0x3367cc98  <+0016>  ldr   r5, [r4, #8]
这是代理端的代码。代理由App_代理保留,因为它是主控制器

- (void) done: (UIViewController *) caller {
   NSLog(@"Taken back control");// this never displays
   [caller.view removeFromSuperview];
   [caller release];
}
一些额外信息: 主控制器保留分包辊。 我还修改了主控制器和子控制器中的释放,以便在调用时记录。基于可见的日志,在应用程序过程中不会调用任何一个。因此,消息的接收者和发送者都是有效对象


我在这里真是不知所措。期待您的帮助。

只是一个粗略的猜测,但如果偶尔是viewDidLoad或viewDidUnload在收到内存警告后导致EXC\u坏访问。检查父/子控制器中已释放/保留/创建的实例变量,尤其是在上述视图加载方法中。

如果从未执行NSLog调用done:,则这只能表示您没有调用主控制器的done:。这可能意味着self.delegate无效。对象可能有效且处于活动状态,但它们之间的链接self.delegate无效。请检查一下。在doStuff中的Done分支中,显示self.delegate的地址


调用完成前:并将其与主控制器的地址进行比较。

尝试在调用前执行检查协议和方法,如代码所示:

- (void) done: (UIViewController *) caller {
   NSLog(@"Taken back control");// this never displays
   [caller.view removeFromSuperview];
   [caller release];
}
- (void) doStuff 
{
    if(mode == Done) 
    {
        NSLog(@"Done. Handling back control");//this is the last log displayed by the console
        if ([delegate conformsToProtocol: @protocol(ParentControllerDelegate)])
        {
            if ([delegate respondsToSelector: @selector(done:)] == YES)
            {
                [delegate performSelector: @selector(done:) withObject: self];            
            }
        }
    } 
    else 
    {
       // some controller code

你在这里写的财产声明正确吗?请检查!实际上,您有一个方法正在释放自己。这是非常糟糕的做法。包含此对象实例的类应该正在执行释放。不是类本身。我要冒险说你的属性声明是错误的-试试@property assign id delegate。我已经更正了属性声明。经过一整天的调试,我输入了错误的方法。是否尝试重命名该方法?同时尝试打印委托描述。视图是从nib文件创建的。我在viewDidUnload方法中释放插座。我仅有的其他变量是子视图中的委托,以及用于在父视图中存储子控制器的retain属性。我想这没问题。我按照你的建议做了。事实上,当崩溃发生时,地址是不同的。在测试运行中,我确定主控制器地址为0x180fe0,但代理地址为0x180fe1。然而,在最初的三次迭代中,他们确实达成了一致,只是过了一段时间,他们才逐渐显现出来。这很奇怪,因为只有一个地方我设置了委托。我进一步调查了地址问题。分配是正确的,即分配后,自我委托的地址与主控制器的地址相同。然而,在doStuff方法的non-Done分支之后,它会发生变化,总是以1为单位。一个关闭1字节的地址确实很奇怪。ivar上一定写着什么,否则我无法解释。有什么办法吗?我一点也不知道-我不做任何指针操作或手动内存管理。不,对不起。我必须查看您的所有代码,我想这不是一个选项。查看任何ivar的所有访问。分包商的IVAR是如何布置的?只需发送一条消息即可调用崩溃。似乎每隔一段时间,委托变量中存储的地址与实际对象的地址相差1。
NSLog(@"%p", self.delegate);
- (void) doStuff 
{
    if(mode == Done) 
    {
        NSLog(@"Done. Handling back control");//this is the last log displayed by the console
        if ([delegate conformsToProtocol: @protocol(ParentControllerDelegate)])
        {
            if ([delegate respondsToSelector: @selector(done:)] == YES)
            {
                [delegate performSelector: @selector(done:) withObject: self];            
            }
        }
    } 
    else 
    {
       // some controller code