由于位置管理器,展开 segue 后崩溃
Crash after unwind segue due to location manager
我有几个 viewcontroller 展开到根 viewcontroller。对于大多数 viewcontrollers,unwind segue 运行良好而不会导致应用程序崩溃。只有使用 CLlocationmanager 的 viewcontrollers 无法执行到根 viewcontroller 的展开转场。这些是使我的代码与众不同的行:
//Init the location Manager
locationManager = [[CLLocationManager alloc] init];
[locationManager requestWhenInUseAuthorization];
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
locationManager.delegate = self;
通过评论我的代码的这一部分,展开工作。特别是最后一行有所不同。我试图在放松之前释放 locationmanager。有时它有效。有时它不会。调试控制台显示:
0x10bfe1005: movq (%rdi), %r11
0x10bfe1008: movq %rsi, %r10
0x10bfe100b: andl 0x18(%r11), %r10d<---Thread 1: EXC Bad_Access(code=1, adress=0x18)
0x10bfe100f: shlq [=11=]x4, %r10
0x10bfe1013: addq 0x10(%r11), %r10
不管那是什么意思。我不知道该怎么办。
编辑
添加这个后
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
[locationManager stopUpdatingLocation];
[locationManager release];
}
有点效果。我试了 5 次。然后它又崩溃了:(真的很奇怪。不确定,但错误消息似乎已经改变了。它说 "WebThread" (见下文)。我确实有一个 webview,它也有委托方法。我会尝试发布网络视图也是如此。
libobjc.A.dylib`objc_msgSend:
0x32f9af60: cbz r0, 0x32f9af9e ; objc_msgSend + 62
0x32f9af62: ldr.w r9, [r0]
0x32f9af66: ldrh.w r12, [r9, #12] <-----WebThread(10):EXC_bad_access(code=1, address=0x100000c)
0x32f9af6a: ldr.w r9, [r9, #8]
0x32f9af6e: and.w r12, r12, r1
0x32f9af72: add.w r9, r9, r12, lsl #3
0x32f9af76: ldr.w r12, [r9]
0x32f9af7a: teq.w r12, r1
0x32f9af7e: bne 0x32f9af86 ; objc_msgSend + 38
0x32f9af80: ldr.w r12, [r9, #4]
0x32f9af84: bx r12
0x32f9af86: cmp.w r12, #0x1
0x32f9af8a: blo 0x32f9af98 ; objc_msgSend + 56
0x32f9af8c: it eq
0x32f9af8e: ldreq.w r9, [r9, #4]
0x32f9af92: ldr r12, [r9, #8]!
0x32f9af96: b 0x32f9af7a ; objc_msgSend + 26
0x32f9af98: ldr.w r9, [r0]
0x32f9af9c: b 0x32f9b1e0 ; _objc_msgSend_uncached
0x32f9af9e: mov.w r1, #0x0
0x32f9afa2: bx lr
0x32f9afa4: nop
0x32f9afa6: nop
0x32f9afa8: nop
0x32f9afaa: nop
0x32f9afac: nop
0x32f9afae: nop
0x32f9afb0: nop
0x32f9afb2: nop
0x32f9afb4: nop
0x32f9afb6: nop
0x32f9afb8: nop
0x32f9afba: nop
0x32f9afbc: nop
0x32f9afbe: nop
EDIT2
好的,在prepareforsegue方法中释放location manager和webview后就可以了。
您需要在放松之前停止位置管理器。
当你展开时,你实际上是在卸载和释放你正在展开的ViewController。
但是,因为它是 locationManager 的委托,所以位置管理器正在尝试将信息传递给它。
你应该可以用...解决这个问题
[locationManager stopUpdatingLocation];
放松之前。 (可能在 prepareForSegue 方法中)。
我有几个 viewcontroller 展开到根 viewcontroller。对于大多数 viewcontrollers,unwind segue 运行良好而不会导致应用程序崩溃。只有使用 CLlocationmanager 的 viewcontrollers 无法执行到根 viewcontroller 的展开转场。这些是使我的代码与众不同的行:
//Init the location Manager
locationManager = [[CLLocationManager alloc] init];
[locationManager requestWhenInUseAuthorization];
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
locationManager.delegate = self;
通过评论我的代码的这一部分,展开工作。特别是最后一行有所不同。我试图在放松之前释放 locationmanager。有时它有效。有时它不会。调试控制台显示:
0x10bfe1005: movq (%rdi), %r11
0x10bfe1008: movq %rsi, %r10
0x10bfe100b: andl 0x18(%r11), %r10d<---Thread 1: EXC Bad_Access(code=1, adress=0x18)
0x10bfe100f: shlq [=11=]x4, %r10
0x10bfe1013: addq 0x10(%r11), %r10
不管那是什么意思。我不知道该怎么办。
编辑
添加这个后
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
[locationManager stopUpdatingLocation];
[locationManager release];
}
有点效果。我试了 5 次。然后它又崩溃了:(真的很奇怪。不确定,但错误消息似乎已经改变了。它说 "WebThread" (见下文)。我确实有一个 webview,它也有委托方法。我会尝试发布网络视图也是如此。
libobjc.A.dylib`objc_msgSend:
0x32f9af60: cbz r0, 0x32f9af9e ; objc_msgSend + 62
0x32f9af62: ldr.w r9, [r0]
0x32f9af66: ldrh.w r12, [r9, #12] <-----WebThread(10):EXC_bad_access(code=1, address=0x100000c)
0x32f9af6a: ldr.w r9, [r9, #8]
0x32f9af6e: and.w r12, r12, r1
0x32f9af72: add.w r9, r9, r12, lsl #3
0x32f9af76: ldr.w r12, [r9]
0x32f9af7a: teq.w r12, r1
0x32f9af7e: bne 0x32f9af86 ; objc_msgSend + 38
0x32f9af80: ldr.w r12, [r9, #4]
0x32f9af84: bx r12
0x32f9af86: cmp.w r12, #0x1
0x32f9af8a: blo 0x32f9af98 ; objc_msgSend + 56
0x32f9af8c: it eq
0x32f9af8e: ldreq.w r9, [r9, #4]
0x32f9af92: ldr r12, [r9, #8]!
0x32f9af96: b 0x32f9af7a ; objc_msgSend + 26
0x32f9af98: ldr.w r9, [r0]
0x32f9af9c: b 0x32f9b1e0 ; _objc_msgSend_uncached
0x32f9af9e: mov.w r1, #0x0
0x32f9afa2: bx lr
0x32f9afa4: nop
0x32f9afa6: nop
0x32f9afa8: nop
0x32f9afaa: nop
0x32f9afac: nop
0x32f9afae: nop
0x32f9afb0: nop
0x32f9afb2: nop
0x32f9afb4: nop
0x32f9afb6: nop
0x32f9afb8: nop
0x32f9afba: nop
0x32f9afbc: nop
0x32f9afbe: nop
EDIT2
好的,在prepareforsegue方法中释放location manager和webview后就可以了。
您需要在放松之前停止位置管理器。
当你展开时,你实际上是在卸载和释放你正在展开的ViewController。
但是,因为它是 locationManager 的委托,所以位置管理器正在尝试将信息传递给它。
你应该可以用...解决这个问题
[locationManager stopUpdatingLocation];
放松之前。 (可能在 prepareForSegue 方法中)。