iOS开发——Block详解


1. Block是什么

  • 代码块
  • 匿名函数
  • 闭包——能够读取其他函数内部变量的函数
  • 函数变量
  • 实现基于指针和函数指针
  • 实现回调的机制

Block是一个非常有特色的语法,它可以把一个代码块作为一个变量来保存,也可以通过函数传递变量,然后让其他的对象来执行这一代码块。可以保存传递并在其他地方执行的代码块,这是我对Block的理解,也是我觉得Block最吸引我的地方。

2. 怎么写Block

官方写法

/**直接定义——返回Block指针
* ^返回类型<可省略>(参数类型 参数)<没有参数可省略>{
* 代码块;
* };
*/
^int(int a){
return a;
};
/**使用Block——返回Block返回值
* Block(参数)
*/
^int(int a){
return a;
}(5);
/**声明定义Block变量
* 返回类型 (^变量名)(参数类型);
*/
int (^example)(int);
example = ^(int a){
return a;
};

最建议写法

/**类型声明定义Block变量
* typedef 返回类型 (^Block名)(参数类型);
*/
typedef int (^Example)(int);
Example eg = ^(int a){
return a;
};
eg(5);

3. Block存在的坑

  • 默认Block只能访问局部变量的值,但是不能修改局部变量的值
  • 要修改局部变量的值需要在定义变量前面加上__block
  • 要修改局部对象的值需要在定义对象前面加上__weak
  • 全局变量的机制跟局部变量一样,默认传入时只会Copy源变量,对它修改不会起到任何作用,只有用__block或者__weak修饰的变量操作才有意义
  • 块是在栈上分布的,如果要保留块,就必须使用copy@property (nonamatic, copy) ABlock eg;

iOS开发——Block详解的更多相关文章

  1. iOS开发:详解Objective-C runTime

    Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...

  2. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  3. iOS开发——MVC详解&Swift+OC

    MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过 ...

  4. IOS开发之----详解在IOS后台执行

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 ...

  5. iOS开发--Bison详解连连支付集成简书

    "最近由于公司项目需要集成连连支付,文档写的不是很清楚,遇到了一些坑,因此记录一下,希望能帮到有需要的人." 前面简单的集成没有遇到什么坑,在此整理一下官方的集成文档,具体步骤如下 ...

  6. iOS开发-NSURLSession详解

    Core Foundation中NSURLConnection在2003年伴随着Safari浏览器的发行,诞生的时间比较久远,iOS升级比较快,AFNetWorking在3.0版本删除了所有基于NSU ...

  7. iOS开发之详解正则表达式

    本文由Charles翻自raywenderlich原文:NSRegularExpression Tutorial: Getting Started更新提示:本教程被James Frost更新到了iOS ...

  8. iOS开发-Runtime详解(简书)

    简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...

  9. iOS开发CAAnimation详解

    Core Animation,即为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能.Core Anima ...

随机推荐

  1. Linux下GPIO驱动(一) ----一个简单的LED驱动

    /******************************* * *杂项设备驱动:miscdevice *majior=10; * * *****************************/ ...

  2. 使用Result代替ResultSet作为方法返回值

    在开发过程中,我们不能将ResultSet对象作为方法的返回值,因为Connection连接一旦关闭,在此连接上的会话和在会话上的结果集也将会自动关闭,而Result对象则不会发生这种现象,所以在查询 ...

  3. 4、Hbase

    1).逻辑模型 Hbase 以表的形式存储数据,每个表由行和列组成,每个列属于一个特定的列族. 表中由行和列确定的存储单元称为一个元素,每个元素保存了同一份数据的多个版本,由时间戳来标识.行健是数据行 ...

  4. Class.forName()的作用与使用总结(转载)

    转载自:Class.forName()的作用与使用总结 1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机 ...

  5. 软件测试 -- 和用户共同测试(UAT测试)的注意点有哪些

    软件产品在投产前,通常都会进行用户验收测试.如果用户验收测试没有通过,直接结果就是那不到“Money”,间接影响是损害了公司的形象,而后者的影响往往更严重.根据作者的经验,用户验收测试一定要让用户满意 ...

  6. iis认证方式

    http://msdn.microsoft.com/en-us/library/aa302377.aspx

  7. IQKeyboredManager使用

    这个库是一个单例,它一旦生效,全项目任何界面都有效.让它生效的代码可以写在任意位置,我写在AppDelegate里. 1 2 3 4 5 6 7 8 9 10 - (BOOL)application: ...

  8. 1012: [JSOI2008]最大数maxnumber

    单点更新,区间求最大值的题: 可以使用树状数组和线段树: #include<cstdio> #include<cstring> #include<algorithm> ...

  9. 理解 Android 本地数据存储 API

    利用首选项.SQLite 和内部及外部内存 API 对于需要跨应用程序执行期间或生命期而维护重要信息的应用程序来说,能够在移动设备上本地存储数据是一种非常关键的功能.作为一名开发人员,您经常需要存储诸 ...

  10. ASP.NET Application,Session,Cookie和ViewState等对象用法和区别 (转)

    在ASP.NET中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache等.下面分别介绍它们的用法和区别. 方法 信息量大小 作用域和保 ...