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. [HTML]marquee标签属性详解

    请大家先看下面这段代码:<marquee direction=upbehavior=scrollloop=3scrollamount=1 scrolldelay=10align=topbgcol ...

  2. PHP初学留神(五)·小结

    来学习快两个月了,这周末即将回家开始写论文.那么走之前,好好总结一下这两个月的所学所得吧.这段时间,在实验室里做的Web开发主要涉及到了web开发的一些框架内容以及php基础知识.思维导图记录如下. ...

  3. 换行符‘\n’和回车符‘\r’

    顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符 '\n' 10 换行(newline)'\r' 13 回车(return) 也可以表示为 ...

  4. WebLogic启动时报错

    java.lang.ClassCastException: com.octetstring.vde.backend.BackendRoot cannot be cast to com.octetstr ...

  5. HtmlTestRunner二次封装(TestRunner.py)

    将HtmlTestRunner进行二次封装,使报告生成的更方便 import HTMLTestRunner import unittest import time, os class TestRunn ...

  6. ExtJs Ext.panel.Panel和Ext.container.Viewport布局问题

    Ext.container.Viewport Ext.panel.Panel Viewport 它的布局会占用整个 body,也应该是这样,它会随着浏览器的高度和宽度的变化而变化. Panel 布局时 ...

  7. python 中参数*args, **kwargs

    def func(*args, **kwargs): print 'args : ', args print 'kwargs :', kwargs def test(): func(1,2,'x',' ...

  8. selenium各种场景下的启动Firefox

    开始学习selenium时为了启动Firefox可谓费尽周折,在大神的帮助下才堪堪搞定,走出了selenium的第一步:jdk1.8 + selenium_2.46 + Firefox国际版40.0. ...

  9. [codility]Equi-leader

    http://codility.com/demo/take-sample-test/equileader 一开始想到从左和右两边开始扫取众数,但求众数又要重新扫一遍,这样复杂度就是O(n^2)了.此题 ...

  10. Java异常处理之throws抛出异常

    package com.test; import java.io.FileReader; public class Test2 { public static void main(String[] a ...