unowned self, 和 weak delegate

解除循环引用,不被释放,  必须是自己的实例属性。

Swfit 3.0语法:

带参数

//block ,closure definetion
 lazy var someClosureName:(Int,String)->String = {
     [unowned self, weak delegate = self.delegate!] (index:Int,stringToProcess:String)->String in 
    //code
 
 }
 //不带参数
 //no parameter
 lazy var someClosureName:()->String = {
 [unowned self, weak delegate = self.delegate!]
 //code
 }
 
 //lazy 表示调用时才初始化,多线程调用时,可能会被多次初始化

举例代码,实例拥有类似Object-c 的Block 、函数堆栈,作为类属性时,需要申明解除循环引用

class AnotherElement:NSObject{
    var closure:(()->())?
  
}

class HtmlElement{
    var name:String!
    var text:String!
    

    /*测试对象属性的self引用*/

lazy var html:()->String = { [unowned self] in return "<\(self.name)/>\(self.text)<\(self.name)/>" } init(name:String,text:String) { self.name = name; self.text = text }

    /*测试非对象属性的Closureself的引用,*/

func testNoProperty() { let another = AnotherElement() another.closure = { print("testAnoter:\(self.name)") } } deinit { print("HtmlElement Instance being deallocated!") } } var htmlInstance:HtmlElement? = HtmlElement(name: "p", text: "我是P标签") print(htmlInstance!.html()) print(htmlInstance!.testNoProperty()) htmlInstance = nil


print

<Optional("p")/>Optional("我是P标签")<Optional("p")/>

HtmlElement Instance being deallocated!


测试如果把 lazy var html 元素的 [unowned self],删除掉,self 将不会被释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值