- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个自定义的 UIView
,它的几个实例是在一个循环中创建的:
let models = CDMyModel.MR_findAllSortedBy("position", ascending: true) as! [CDMyModel]
for view in myViews {
view.removeFromSuperview()
}
self.myViews.removeAll(keepCapacity: true)
for model in models {
let myView = MYFaqView(width: CGRectGetWidth(self.view.frame))
myView.titleLabel.text = model.title
myView.content.text = model.content
myView.titleLabel.sizeToFit()
self.scrollView.addSubview(myView)
self.myViews.append(myView)
}
我有时会在 Crashlytics 中看到 myView.content.text = model.content
行崩溃:
根据崩溃情况,我认为它与内存有关,但我真的不知道那时 myView 是如何被释放的。
所有这一切都发生在 viewWillAppear:
中。之前的删除是否与此有关?但我假设一切都发生在主线程上,所以这也不应该成为问题 - 我真的被困在这里了。
崩溃发生在 iOS 9 上。
编辑
MyFaqView 初始化方法:
init(width:CGFloat) {
self.width = width
super.init(frame: CGRectZero)
self.addSubview(self.titleLabel)
self.addSubview(self.toggleImageView)
self.addSubview(self.separatorView)
self.content.clipsToBounds = true
self.addSubview(self.content)
self.translatesAutoresizingMaskIntoConstraints = false
self.clipsToBounds = true
}
编辑
let content:UILabel = {
let l = UILabel()
l.numberOfLines = 0
if let font = UIFont(name: "OpenSans", size: 14) {
l.font = font
}
return l
}()
最佳答案
这些问题总是很难追踪。
基本上,发生的是内存损坏。您的 UILabel
content 之前占用的地址 0x14f822a0
已被其他东西使用,在本例中为 CALayer
。如果崩溃发生在本地,您可以通过在 lldb 中输入 po 0x14f822a0
来验证这一点,并且肯定会输出该地址为 CALayer
类型。
对于这些错误,虽然崩溃线可以提供线索,但并不总是导致错误的原因。其他地方已经发生了一些事情。
虽然 Swift 主要是内存管理的,但对于粗心的人来说仍然存在陷阱。我个人看到了内存损坏的两个主要原因。第一个是由自引用闭包引起的保留循环。第二个 - 与您的问题更相关 - 与 Storyboards 和 Xibs 相关的 View 。
如果我们从逻辑上遵循这一点,我们可以认为 CALayer
现在占用了您的 UILabel
content 之前占用的地址空间。运行时尝试向被认为占用该地址的对象发送消息,并被 Swift 运行时断言捕获,然后触发 EXC_BAD_INSTRUCTION
崩溃。
现在,对于在该地址居住的其他一些对象,UILabel
content 的原始居民必须已被释放。那么为什么运行时会发布内容呢?因为它不再需要,即它不是它仍然需要的任何 View 的 subview 或属性。
我敢打赌,如果您将 content 更改为子类 UILabel
并添加一个 deinit
方法,然后断点,您将惊讶地发现它很早就被意外地取消了初始化。要对此进行测试,请创建一个类型,如下所示:
class DebugLabel: UILabel
{
func deinit
{
NSLog("Breakpoint on this line here!")
}
}
然后将content的类型更改为上面的DebugLabel
。
那么为什么会发生这一切?我的钱在于您拥有一个以编程方式创建为 weak
或 unowned
的 View 属性。也许您之前使用 IBOutlet
设置了这些,然后您删除了但忘记删除 weak
指示符?
仔细检查每一项,我相信您会找到上述问题的原因。使用初始化程序或 UINib
以编程方式创建的任何内容都不应指定为 weak
或 unowned
。
关于swift - UILabel 怎么会变成 CALayer 并导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859214/
问题很简单:看代码。两个静态断言都通过了。我不希望第二个通过。这是错误还是正常行为? #include #include template class Temp, class Specializ
int Sequence::scoreDegeneracy() { cout const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== b
我已经测试了下面的代码,除了第 29 行之外,一切都按照我的预期进行。final.write(invrow) 实际上并没有写入文件。当我使用简单的 print invrow 时,它显示没有问题。我没有
我的项目中有很多类被单例访问,如下所示: _inline GUI_BS_Map* GUI_GetBS_Map() { static GUI_BS_Map obj; return &ob
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我针对我遇到的问题截取了几张屏幕截图。基本上,我对 vi 的习惯和期望是能够使用箭头键在文档中移动,并且仍然能够阅读文档的实际内容。 Here is a shot of vi editor as I
NSDateFormatter *timeFormatter = [[[NSDateFormatter alloc] init] autorelease]; [timeFormatter se
根据docs : The HTMLCanvasElement.toDataURL() method returns a data URI containing a representation of
我做了一个小函数,可以实际测量最大递归限制: def f(x): r = x try: r = f(x+1) except Exception as e:
我正在开发一个小型 silverlight 应用程序,该应用程序涉及在 javascript 和 silverlight 之间传递一些数据。我也在使用 silverlight 虚拟地球控件。 我遇到的
我在Chrome和Firefox中都试过了,浏览器好像没有问题。我的 CSS 是有效的,但是当我通过验证运行我的 HTML 时,它显示“元素链接上属性 rel 的错误值‘stylesheet’:字符串
如果我有一个类,其中的 ctor 设置为像这样的多重注入(inject): public Shogun(IEnumerable allWeapons) { this.allWeapons =
我现在正在使用 devise/omniauth。通过 facebook/twitter 注册后,我想重定向到一个名为“验证电子邮件”的页面,他们可以在其中验证他们的电子邮件地址是否正确。 我只是想让
我有两个相同的交易,在这种情况下发送相同数量的代币,导致实际消耗的气体不同(不是成本,而是显着差异)。 以下是 tx 哈希值: 0x2cbb4b35d87cabe1a7b7bcb562e4e046e9
如果我这样做: ExpiresActive On ExpiresDefault "access plus 30 days" 它没有正确设置 Expire header
我无法过滤我想要查看的特定软件包,因为 cpusettings 菜单呈灰色。 我正在使用 VisualVM 运行程序从 eclipse 运行我的应用程序。 最佳答案 采样过程中无法更改 CPU 设置。
在 http://www.gwtproject.org/doc/latest/DevGuideUiBinder.html 它指出要在 uiBinder 模板中使用小部件: they must be d
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我有下面的代码,但是,当我用 visual studio code 修改代码并在我的 Chrome 浏览器中运行它时,我在“热门产品”中看不到下拉菜单。部分。 但是,当我在此处 (stackoverf
我有两个类(class)联系人和群组 FirstName 和LastName 的组合必须是唯一的,并且可以为单个联系人添加多个地址。我如何在 Entity Framework 代码优先方法中做到这一点
我是一名优秀的程序员,十分优秀!