解除循环引用,不被释放, 必须是自己的实例属性。
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
}
/*测试非对象属性的Closure对self的引用,*/
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
<Optional("p")/>Optional("我是P标签")<Optional("p")/>
HtmlElement Instance being deallocated!