swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;

用法如下:

WS(weakself)

[self.tableView addHeaderWithCallback:^{

[weakself requestMemberList];

}];

 

 

swift 在比闭包 中使用 weakSelf

weak var weakSelf = self
demo4 {
    // 使用?的好处 就是一旦 self 被释放,就什么也不做
    weakSelf?.view.backgroundColor = UIColor.redColor()
}

 

这才是高级方法:

swift 中一个类可以嵌套定义另外类,新增加的类只能被当前类使用

在 swift 中,要解除闭包的 循环引用,可以在闭包定义中使用 [unowned self] 或者 [weak self],其中:

[unowned self] 类似与 OC 中的 unsafe_unretained,如果对象被释放,仍然保留一个 无效引用,不是可选项

 [weak self] 类似与 OC 中的 __weak,如果对象被释放,自动指向 nil,更安全

[weak self] 时时监控性能较差,[unowned self]可能导致野指针错误,如果能够确定对象不会被释放,尽量使用 unowned

 

例子   懒加载的闭包

lazy var printName: ()->() = { [unowned self] in

        print(self.name)

   }

 

 // 下面这句不会发生发生循环引用因为执行完就会消失

 lazy var title: String = {

        print(self.name)

        

        return "Mr. \(self.name)"

    }()

posted @ 2015-07-06 23:36  风中一场梦  阅读(5548)  评论(0编辑  收藏  举报