我正在初始化一个对象,然后将其配置为内联。但是,在配置它之前(在直接跟随的行上)不是先前的实例(如果先前已分配)被释放,则延迟释放。所以我对它做的所有配置最终都是一个解除分配的对象 - 当然这不是我想要的。
例如,如果我运行此代码:
if paintingView != nil {
paintingView.removeFromSuperview()
}
print("^^^^^^^^^^^^^ About to init")
paintingView = PaintingView(frame: TDTDeviceUtilites.screenFrame())
print("^^^^^^^^^^^^^ About to add view")
view.addSubview(paintingView)
print("^^^^^^^^^^^^^ About to configure")
self.configurePaintingView()
我将在控制台中看到以下消息:
^^^^^^^^^^^^^ About to init
^^^^^^^^^^^^^ About to add view
^^^^^^^^^^^^^ About to configure
***** Painting View Dealloc ***** //message from the dealloc method of the PaintingView class.
我希望dealloc直接在init行之后发生。到底是怎么回事?请注意,此代码是在NSOperationQueue()中调用的。
我如何确保首先发生dealloc,为什么不是这样呢?
答案 0 :(得分:0)
Apple背后的事情让所有应用程序更有效率。有时实际发生的事情令人惊讶。但是,它始终不会对您产生任何影响。
一种可能的优化(我个人无法检查Apple是否这样做)是在后台线程上解除分配。当对象的引用计数降至零时,对象将被释放。当发生这种情况时,它被标记为"此对象将被解除分配",并且 将被取消分配。但不一定在将引用计数设置为0的线程中。在单独的线程上执行实际的dealloc可以更好地使用多个处理器,并使前台应用程序运行得更快。
它不应该对您的代码产生任何影响。