我们有选择地使用自动布局约束,主要是为了定位与可编辑字段元素相关的标签(通常是UITextView,UITextField).但是,自从为这些字段实现自动布局以来,每当我们卸载视图,解除分配等时,我们都会看到一个令人讨厌的异常并崩溃.异常发生的原因是它试图在卸载视图之前从视图中删除约束.
我们的视图/控制器层次结构如下:
UITableViewController (plain style, but with cell appearance to mimic grouped style)
--> UITableViewCell
----> UIViewController (container for editable form)
------> UICollectionViewController (editable form)
--------> UICollectionViewCell
-----------> UIViewController (editable field)
--------------> UILabel (field label) **HAS CONSTRAINTS**
--------------> UITextView / UITextField (field value) **HAS CONSTRAINTS**
Run Code Online (Sandbox Code Playgroud)
很多时候,当上层表格单元被解除分配/替换/重新加载时,我们会看到一个巨大的异常,然后崩溃,因为它试图释放/卸载其中的视图层次结构.
我试图通过捕获异常(没有帮助)并通过在释放/卸载(in viewWillDisappear:)之前强制删除受影响的视图和所有子视图上的所有约束来缓解崩溃,它似乎没有帮助.我甚至试图逐个删除这些约束,看看是否有一个特别是导致麻烦但是当我们打电话removeConstraint:或removeConstraints:在容器上准备消失时它们都会爆炸.
我很困惑!这是我们例外的一小部分 - 大约有3000行被切断了,所以如果你需要更多,请问.
Exception while deallocating view: { Rows:
0x18911270.posErrorMarker == 4 + 1*0x18911270.negError + 1*0x189112f0.marker + -1*0x189113f0.negError + 1*0x189113f0.posErrorMarker + 1*0x18911a60.marker + -0.5*0x1892dae0.negError + 0.5*0x1892dae0.posErrorMarker + …Run Code Online (Sandbox Code Playgroud) 我收到一个无法确定性地重新创建的随机错误,这使得调试很麻烦.例外是
NSInternalInconsistencyException {Rows:0x1e5eb080.posErrorMarker == 1 + 1*0x1e5eb080.negError + 1*0x1fa51a40.marker 0x1f933020.negError == 274 + 1*0x1f933020.posErrorMarker + -1*0x1fb84100.marker 0x1fb8d610.negError == 274 + -1
>
0CoreFoundation 0x32c1b3e7 + 162
1libobjc.A.dylib 0x3a916963 objc_exception_throw + 30
2CoreFoundation 0x32c1b307 + 106
3Foundation 0x335ce24f + 190
4Foundation 0x335d0871 + 60
5Foundation 0x335d19e9 + 624
6Foundation 0x335d9eab + 230
7UIKit 0x34e6211b + 162
8UIKit 0x34e67b9f + 26
9CoreFoundation 0x32b61acd CFArrayApplyFunction + 176
10UIKit 0x34e67bdf + 90
11CoreFoundation 0x32b61acd CFArrayApplyFunction + 176
12UIKit 0x34e67bdf + 90
13CoreFoundation 0x32b61acd CFArrayApplyFunction …Run Code Online (Sandbox Code Playgroud) 我在iOS7上的自动布局问题上崩溃了(iOS8可以工作)
问题是-该UIButton的指示(0x7b7780a0)不存在(当我看recursiveDescription的UIView).
我该如何调查这个?从哪儿开始?
编辑:
我遇到了这个答案,/sf/answers/1909885001/确实我在回溯中有一个非常小的浮点数,但是 - 我没有在代码中添加约束,我的所有乘数都是1
编辑: 发给自己一个答案 - 但/sf/answers/1909885001/是一个很好的答案,最终指导我解决方案
碰撞:
2015-03-10 15:50:08.152 Cookila copy[5779:607] Objective: {objective 0x7b84c960: <750:-1.04308e-05, 250:6.61612e-05> + <750:-1.04308e-07, 250:8.9407e-08>*UIButton:0x7b6299c0.Width{id: 408} + <750:-2.23517e-08, 250:8.9407e-08>*UIButton:0x7b661ad0.Width{id: 385} + <750:-1.86265e-07, 250:8.9407e-08>*UIButton:0x7b7780a0.Width{id: 388} + <750:1.04308e-07, 250:-1.3411e-07>*UIView:0x7b6547d0.Width{id: 419}}
2015-03-10 15:50:09.674 Cookila copy[5779:607] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<NSISEngine: 0x7b84c120>{ Rows:
UILayoutContainerView:0x7b6505a0.Height{id: 118} == 960 + 1*0x7b7679b0.marker{id: 49} + 2*0x7b638350.marker{id: 135}
UILayoutContainerView:0x7b6505a0.Width{id: 115} == 640 + 1*0x7b767980.marker{id: 46} + 2*0x7b6592b0.marker{id: …Run Code Online (Sandbox Code Playgroud)