一个未引用的对象是否有可能留在内存中并调用目标操作?

By simon at 2018-02-27 • 0人收藏 • 57人看过

我有这样的课程:

class Example: UIView {
    init(frame: CGRect) {
        super.init(frame: frame); 
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismiss(_:)));
        self.addGestureRecognizer(tap)
        self.isUserInteractionEnabled = true;
        self.backgroundColor = UIColor.red;
    }
    func show(parentView: UIView) { 
        parentView.addSubview(self);
    }
    @objc func dismiss(_ sender: UITapGestureRecognizer? = nil) {
        self.removeFromSuperview();
    }
}
然后我想这样称呼它:
override func viewWillAppear() {
    super.viewWillAppear();
    Example.init(frame: self.view.bounds).show(parentView: self.view);
}
该视图以红色高光显示如预期那样回合。但是,当我点击 这个看法,什么都没发生。解雇功能甚至没有被调用。 但如果这样做:
var example : UIView!;
override func viewWillAppear() {
    super.viewWillAppear();
    example = Example.init(frame: self.view.bounds);
    example.show(parentView: self.view);
}
水龙头工作正常。我怀疑这是因为这个物体被毁坏了 一路上?但它仍然存在无线瘦UIView子视图堆栈?一世 认为它并没有被完全摧毁,因为它被引用了 父视图子观点正确吗?我能否让目标行动无需工作? 创建一个局部变量来保存对象(刚刚被引用 子意见)?

2 个回复 | 最后更新于 2018-02-27
2018-02-27   #1

你不需要为Example的实例创建一个ivar 调用show(parent:)你最终添加它添加到视图层次结构, 它保留了它,因此它保留在内存中。 如果我在全新的Xcode单一视图应用程序中运行示例代码离子 项目,没有伊娃,它工作得很好。我的代码:

import UIKit

class Example: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame);
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismiss(_:)));
        self.addGestureRecognizer(tap)
        self.isUserInteractionEnabled = true;
        self.backgroundColor = UIColor.red;
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func show(parentView: UIView) {
        parentView.addSubview(self);
    }
    @objc func dismiss(_ sender: UITapGestureRecognizer? = nil) {
        self.removeFromSuperview();
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        Example.init(frame: self.view.bounds).show(parentView: self.view);
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
当我运行这个代码时会发生什么: [![点击红色视图使它 消失(https://i.stack.imgur.com/iO4dB.gif)](https://i.stack.imgur.com/iO4dB.gif) 所以它看起来像点击t他红色的Example视图使它消失 正如你打算的那样。

2018-02-27   #2

是的,这是有效的,因为超级观点始终是其子视图的所有者。如果 这是不正确的,你的iPhone上的大多数屏幕会很空虚,因为 他们没有一个所有者。出于这个原因,使用弱点也是足够的 网点参考。

登录后方可回帖

Loading...