使用@noescape解决Swift闭包“保留环”问题

在使用Swift进行编程的时候我们经常使用闭包,闭包虽然好,但是不可避免地会带来“保留环”问题,考虑下面的情况:

在某个动画框架中有一个loop函数:

 func loop(duration:NSTimeInterval,reverse:Bool,animations:()->Bool )

在我们自己的类中定义一个动画方法,使用了这个函数:

class MyView:UIView{

    func animations(){
        loop(duration:0.5,reverse:true){
        self.scale(1.25)
        }
    }
    func scale(scale:Double){...}
}

你会发现在闭包中捕获了self,loop函数循环每次都调用闭包,这样会一直保留self。而闭包中的操作其实是一成不变的,没有必要每次都访问。如果我们只调用一次animations闭包,给它拍一张快照就可以解决这个问题了,这就要用到@noescape:

func loop(duration:NSTimeInterval,reverse:Bool,@ noescape animations:()->Bool )

这样就不会有保留环问题,因为这个闭包只被执行一次,即便发生循环时也会绕过闭包。@noescape还是个新角色,但是系统库中已经有些地方在使用了,比如我们熟悉的reduce方法:

func reduce<U>(initial: U, combine: @noescape (U, T) -> U) -> U

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 14:18:29

使用@noescape解决Swift闭包“保留环”问题的相关文章

SWIFt闭包

闭包的三种形式 1.全局函数是一个有名字但不会捕获任何值的闭包2.嵌套函数是一个有名字并且可以捕获其封闭函数域内值的闭包3.闭包表达式时一个利用轻量级语法缩写的可以捕获其上下文中变量或者常量值的没有名字的闭包 SWIFT闭包中的一些特点 1.利用上下文推断参数和返回值类型2.单表达式闭包可以省略return关键字3.参数名称简写4.Trailing闭包语法 闭包表达式 一般情况下我们采用如下方式使用sort 1 // Playground - noun: a place where people

Swift闭包(Closure)

语法: { (parameters) ->return type in statements} 实例:采用函数实现: let names =["Chris", "Alex", "Ewa", "Barry", "Daniella"] funcbackwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed =

第33条:以弱引用避免保留环

本条要点:(作者总结) 对象图里经常会出现一种情况,就是几个对象都以某种方式互相引用,从而形成"环"(cycle).由于 Objective-C 内存管理模型使用引用计数架构,所以这种情况通常会泄漏内存,因为最后没有别的东西会引用环中的对象.这样的话,环里的对象就无法为外界所访问了,但对象之间尚有引用,这些引用使得它们都能继续存活下去,而不会为系统所回收. 最简单的保留环由两个对象构成,它们互相引用对方,图举例说明了这种情况. 两个对象通过彼此之间的强 这种保留环的产生原因不难理解,且

swift闭包的另一种用法

这不是教程. 当你碰到函数参数需要传递一个闭包(closure)时,一般是可以直接这么传递的(假定无返回): // 教程一般教你在参数位置传递closure: someMethod(arg1, arg2, arg3: { args -> Void in //codes here }) // swift同时有一种“同步”的写法: someMethod(arg1, arg2){ args -> Void in //codes here } swift闭包的另一种用法

swift 闭包

swift 中的闭包类似OC中的快代码和java 匿名内部类.它是预先定义了一段可以执行的代码,简单的可以将闭包看做是函数的一种简写 example: 将一个数组按照一定的函数映射成另一个数组 有两种写法: 普通函数的写法: var numbers = [20, 19, 7, 12] “numbers.map({ (number: Int) -> Int in let result = 3 * number return result})” 闭包的形式: var numbers = [20, 1

swift闭包 notes http://www.gittielabs.com

Swift Closureshtml, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirror-scroll { overflow-y: hidden; overflow-x: auto; } .CodeMirror-lines { padding: 4px 0px; } .CodeMirror pre { padding: 0px 4px; } .CodeMirror-scrollbar-f

Swift 闭包(closure)

Swift中的闭包,就是Objective-C中的Block, 其实两者是一个东西 1.Closure变量的声明 (1)Closure就是匿名函数,我们可以定义一个闭包变量,而这个闭包变量的类型就是我们上面介绍的“函数类型”. 定义一个闭包变量其实就是定义一个特定函数类型的变量,方式如下. 因为Closure变量没有赋初始值,所以我们把其声明为可选类型的变量.在使用时,用!强制打开即可. var myCloure0:((Int, Int) -> Int)? (2)我们还用另一种常用的声明闭包变量

Swift 闭包传值

实现例子由两个界面组成 A  B 两个视图 A - > B 使用属性传值 B - > A 使用闭包进行反向回调传值 Swift 使用闭包传值的原理,与OC 中使用代码块(block)传值原理,基本类似 按步骤可以如下理解: 1.定义闭包. 2.闭包赋值(传送) 3.闭包调用. 想对于当前界面上执行某个操作,就在当前界面上定义, 比如:我想通过 B 界面回调 给 A 界面上的label赋值,赋值操作是在 A 界面上执行的.那么闭包就应该定义在 A 界面上.既然定义在 A ,那么 B 界面就是调用

Swift 闭包表达式

闭包是功能性自包含模块,可以在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似. 闭包的形式主要有三种: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 3. 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的没有名字 的闭包 Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中以实现语法优化,主要优化如下: *