莫名其妙的标记之@noescape

Swift 中经常遇到一些不熟悉的关键字, 例如@autoclosure@noescape...等等, 为什么要加这样的关键字, 我自己写方法的时候什么时候要加, 什么时候不加, 都是应该考虑的问题, 所以打算写一系列文章来介绍一下这些关键字.

@noescape

@noescape 用来标记一个闭包, 用法如下

func hostFunc(@noescape closure: () -> ()) -> Void

@noescape字面意思是无法逃脱. 在上例中, closure 被@noescape修饰, 则声明 closure的生命周期不能超过 hostFunc, 并且, closure不能被hostFunc中的其他闭包捕获(也就是强持有).

用例
func hostFunc(@noescape closure: () -> ()) -> Void {
    //以下编译出错, closure 被修饰后, 不能被其他异步线程捕获
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        closure()
    }
}

 

时间: 2024-12-20 17:15:34

莫名其妙的标记之@noescape的相关文章

Swift2.1keyword @noescape介绍

@noescape优化编译器编译,swift 2.1引入. 函数假设有一个一个參数是closure的话,能够在前面加一个关键字@noescape表示在函数return前closure生命周期结束,能够优化编译. (closure 是引用类型, 能够引用到别的地方,例如以下:) class A{ var b: (Void -> Void)! func lalala(a: (Void->Void)){ self.b = a//引用到属性b了 } } 像上面的情况lalala的參数a是不能在前面标记

Swift2.1关键字 @noescape介绍

@noescape优化编译器编译,swift 2.1引入. 函数如果有一个一个参数是closure的话,可以在前面加一个关键字@noescape表示在函数return前closure生命周期结束,可以优化编译.(closure 是引用类型, 可以引用到别的地方,如下:) class A{ var b: (Void -> Void)! func lalala(a: (Void->Void)){ self.b = a//引用到属性b了 } } 像上面的情况lalala的参数a是不能在前面标记@no

7.闭包

闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似. 闭包采取如下三种形式之一: 全局函数是一个有名字但不会捕获任何值的闭包; 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包; 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包; 闭包一般形式语法: { (parameters) -> returnType in statements } O

.htaccess 语法以及应用

[转] http://blog.sina.com.cn/s/blog_6e8b46e701014drc.html http://blog.sina.com.cn/s/blog_6e8b46e701014dtu.html .htaccess是Apache服务器的一个非常强大的分布式配置文件. 正确的理解和使用.htaccess文件,可以帮助我们优化自己的服务器或者虚拟主机. 如何启用htaccess 以windows为例,进入apache/conf目录,找到httpd.conf文件,去掉 Load

URL重写:RewriteCond指令与RewriteRule 指令格式

Rewirte基本的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正則表達式规范.平时帮助我们实现拟静态,拟文件夹,域名跳转,防止盗链等.本文将针对mod_rewrite和URL匹配的技术细节,以及RewriteCond与RewriteRule 指令格式进行探讨. Rewirte模块内部处理 Rewirte模块的内部处理极为复杂,可是为了使一般用户避免犯低级错误.也让管理员能充分利用其功能.在此仍然做一下说明. Rewirte模块API阶段 首先,你必须了解Apache是分若干阶段来

Apache URL重写规则

1.简介 Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块.它的功能非常强大,可以操作URL中的所有部分. 因此我们就可以改写url,给用户提供一个简介大方的url,当用户访问时可以通过mod_rewrite模块功能转换为真正的资源路径.通过mod_rewrite能实现的功能还有很多,例如隐藏真实地址.实现URL跳转.域名跳转.防盗链.限制访问资源类型等等. 2.工作流程 mod_rewrite模块在运行时会使用两个Hook程序. 第一个是从URL到文件名

Swift3.0P1 语法指南——闭包

原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94 1.闭包(Closures) 闭包是独立的函数代码块,可以在代码中被传递和使用.Swift中的闭包与C语言和Objective-C语言中的block.其他语言中的la

apache重写字段详细说明

用Apache虚拟主机的朋友很多,apache提供的.htaccess模块可以为每个虚拟主机设定rewrite规则,这对网站SEO优化相当有用,同时也改善了用户体验.国内的虚拟机一般不提供.htaccess功能(据我所知,discuz的主机好像提供此功能),而在国外主机中,.htaccess功能似乎是标配,笔者的Blog架在MT上,支持.htaccess,每次看到一堆别人写好了的.htaccess设置,很多命令都不甚了了,查看.修改起来很不方便,痛定思痛,潜心学习一下,知其所以然嘛- 学习前提:

Rewrite规则简介

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块.方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块.这tm都是废话,反正我用了,那就肯定是我的服务器已经支持了,我们买服务器的时候也肯定会主要到能不