Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用UINavigationControllerDelegate避免不良访问?_Ios_Objective C_Xcode_Delegates - Fatal编程技术网

Ios 如何使用UINavigationControllerDelegate避免不良访问?

Ios 如何使用UINavigationControllerDelegate避免不良访问?,ios,objective-c,xcode,delegates,Ios,Objective C,Xcode,Delegates,我有3个控制器A,B,C。 从A我有一个到B的推送序列,从B A到C的推送序列。在没有将控制器C设置为UINavigationControllerDelegate的情况下,前进没有问题,我也可以从C->B和B->A后退。如果在C i设置的视图D加载中: self.navigationController.delegate = self; 因为我需要方法navigationController:willShowViewController 我仍然可以从A->B->C和从C->B调用我需要的方法

我有3个控制器A,B,C。 从A我有一个到B的推送序列,从B A到C的推送序列。在没有将控制器C设置为UINavigationControllerDelegate的情况下,前进没有问题,我也可以从C->B和B->A后退。如果在C i设置的视图D加载中:

 self.navigationController.delegate = self;
因为我需要方法navigationController:willShowViewController 我仍然可以从A->B->C和从C->B调用我需要的方法,但是如果我从B->A按后退按钮,我的应用程序会崩溃,说访问错误。我如何避免这种情况?提前谢谢

libobjc.A.dylib`objc_msgSend:
0x14e00a4:  movl   8(%esp), %ecx
0x14e00a8:  movl   4(%esp), %eax
0x14e00ac:  testl  %eax, %eax
0x14e00ae:  je     0x14e0110                 ; objc_msgSend + 108
0x14e00b0:  movl   (%eax), %edx
0x14e00b2:  movzwl 12(%edx), %eax                                 Thread 1:EXC_BAD_ACCESS(code=1,address0x408e3b7c)
0x14e00b6:  andl   %ecx, %eax
0x14e00b8:  shll   $3, %eax
0x14e00bb:  addl   8(%edx), %eax
0x14e00be:  cmpl   (%eax), %ecx
0x14e00c0:  jne    0x14e00c5                 ; objc_msgSend + 33
0x14e00c2:  jmpl   *4(%eax)
0x14e00c5:  cmpl   $0, (%eax)
0x14e00c8:  je     0x14e0119                 ; objc_msgSend + 117
0x14e00ca:  cmpl   8(%edx), %eax
0x14e00cd:  je     0x14e00d9                 ; objc_msgSend + 53
0x14e00cf:  subl   $8, %eax
0x14e00d2:  cmpl   (%eax), %ecx
0x14e00d4:  jne    0x14e00c5                 ; objc_msgSend + 33
0x14e00d6:  jmpl   *4(%eax)
0x14e00d9:  movzwl 12(%edx), %eax
0x14e00dd:  shll   $3, %eax
0x14e00e0:  addl   8(%edx), %eax
0x14e00e3:  jmp    0x14e00f2                 ; objc_msgSend + 78
0x14e00e5:  cmpl   $0, (%eax)
0x14e00e8:  je     0x14e0119                 ; objc_msgSend + 117
0x14e00ea:  cmpl   8(%edx), %eax
0x14e00ed:  je     0x14e00f9                 ; objc_msgSend + 85
0x14e00ef:  subl   $8, %eax
0x14e00f2:  cmpl   (%eax), %ecx
0x14e00f4:  jne    0x14e00e5                 ; objc_msgSend + 65
0x14e00f6:  jmpl   *4(%eax)
0x14e00f9:  pushl  %ebp
0x14e00fa:  movl   %esp, %ebp
0x14e00fc:  pushl  $0
0x14e00fe:  pushl  $0
0x14e0100:  pushl  $0
0x14e0102:  pushl  %edx
0x14e0103:  pushl  %ecx
0x14e0104:  movl   8(%ebp), %ecx
0x14e0107:  pushl  %ecx
0x14e0108:  calll  0x14ce720                 ; objc_msgSend_corrupt_cache_error
0x14e010d:  nopl   (%eax)
0x14e0110:  xorl   %edx, %edx
0x14e0112:  xorps  %xmm0, %xmm0
0x14e0115:  xorps  %xmm1, %xmm1
0x14e0118:  ret    
0x14e0119:  movl   8(%esp), %ecx
0x14e011d:  movl   4(%esp), %eax
0x14e0121:  pushl  %ebp
0x14e0122:  movl   %esp, %ebp
0x14e0124:  subl   $12, %esp
0x14e0127:  pushl  %edx
0x14e0128:  pushl  %ecx
0x14e0129:  pushl  %eax
0x14e012a:  calll  0x14d8017                 ; _class_lookupMethodAndLoadCache3
0x14e012f:  leave  
0x14e0130:  cmpl   %eax, %eax
0x14e0132:  jmpl   *%eax

UINavigationController
的属性不保留该值,因此,如果使用ARC进行内存管理(默认),C可能会被释放,导致委托成为垃圾(这是目前导致错误访问的常见原因)。解决方法是在某个地方保留一些对C的强引用。

堆栈跟踪是什么?我在哪里可以看到它@ConeyBeare当代码崩溃,并且Xcode让您知道时,您可以在调试面板上看到它。您想要从Xcode控制台看到的是错误消息和回溯(使用
bt
调试器命令获取回溯。您提供了汇编代码,这不是我们需要的。如果在navigationController:willShowViewController中,我放置了类似self.navigationController.delegate=nil的内容,会怎么样?内存管理是否有副作用?@mprudhomif我在返回fr之前将委托设置为nilom C到B一切正常。为什么?这是一个好的做法吗?这应该会起作用。如果属性“弱”,它将自动被置零,但由于它是“赋值”,它可能会指向内存的已释放部分。因此,您可以随时手动将其置零。