Ios 如何使用UINavigationControllerDelegate避免不良访问?
我有3个控制器A,B,C。 从A我有一个到B的推送序列,从B A到C的推送序列。在没有将控制器C设置为UINavigationControllerDelegate的情况下,前进没有问题,我也可以从C->B和B->A后退。如果在C i设置的视图D加载中: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调用我需要的方法
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一切正常。为什么?这是一个好的做法吗?这应该会起作用。如果属性“弱”,它将自动被置零,但由于它是“赋值”,它可能会指向内存的已释放部分。因此,您可以随时手动将其置零。