如何使用UINavigationControllerDelegate避免BAD_ACCESS?

时间:2013-12-30 19:13:37

标签: ios objective-c xcode delegates

我有3个viewController A,B,C。 从A i到推送segue到B并且从B推送segue到C.没有问题向前并且没有设置控制器C作为UINavigationControllerDelegate我也可以从C-> B和B-> A向后返回。如果在C i的viewDidLoad中设置:

 self.navigationController.delegate = self;

因为我需要方法navigationController:willShowViewController 我仍然可以从A-> B-> C和C-> B调用我需要的方法但是如果我按下B-后面的按钮>我的应用程序崩溃说BAD_ACCESS.How我可以避免这个?提前致谢

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

1 个答案:

答案 0 :(得分:0)

UINavigationController的{​​{3}}属性不保留该值,因此如果您使用ARC进行内存管理(默认),则可能会释放C,导致委托为垃圾(这些天是BAD_ACCESS错误的常见原因)。解决方案是简单地对C进行一些强有力的参考。