在OC的Block 中
1. __block 修饰的变量 是 地址传递 也就是 & 传递过去,其引用计数器不会增加
2. __weak 在ARC 情况下使用 MRC情况下使用 __unsafe_unretained , 一般用于 block 作为参数传入的时候,需要引用了外部的对象 如 self 是经常使用的
//添加点击事件 //创建出一个self 对象 不增加引用计数器 __weak typeof(self) weakSelf = self; [button addClickedTouchUp:^(UIButton *sender) { [weakSelf switchKeyDoSomething:sender]; }];
在Swift的闭包 (Closure)中
1.使用 Lazy 或者 熟悉闭包的时候可以 [weak self] in
lazy var btn:UIButton = { [weak self] in let btn = UIButton() // weak 表示 self 在这个方法运行的时候,可能会消失,也就是self 被释放内存,所以是一个可选类型 // 如果确认 self 不会消失,就可以使用 [unowned self] in if let strongSelf = self{ strongSelf.view.addSubview(btn) } return btn }()
2. 在回调有参数的情况下
// 下拉刷新 tableView.addHeaderPullCallback{ [weak self] (Void) -> () in if let strongSelf = self { strongSelf.downLoadData() } } // 可以使用多标注[weak self, unowned ...]