在网上见过这么个面试题

使用block和GCD时要注意些什么?他们是一回事吗?block在ARC和MRC的用法有什么不同?使用时要注意些什么?

首先block 和 GCD 在我看来他们是完全不同的概念。在使用GCD的时候经常会用block作为回调 下面记下刚刚研究的成果

根据序号标出执行顺序

typedef int (^ myBlock)(int m) ; 首先定义一种类型  这里可以没有返回值

- (void)viewDidLoad

{

[super viewDidLoad];

[ self print:^int(int m) {    // 1 .在这里转入一个block 给print 方法 这个很好理解

 NSLog(@"====>%d",m); // 9.  所以这里为第二次回调 这里hello 这个block 中m的值给了这里m的值 所以第二次打印在这里

return m;   // 10.然后由于前面定义block的时候有返回值

}];

} // 15

- (void)print:(myBlock)my  // 2 . 当调用方法后 应该开始执行该方法

{

[self hello:^int(int m) {  //3. 一样传入一个block 给hello 这个方法

NSLog(@"--->%d",m);  // 7. 由于开始执行hi block块  block块的主体在这里  所以这里第一次打印   同时完成第一次回调 下面k 的值传到了这里m= k = 9

my(m);    // 8 . 开始执行my这个block块

return 2 ; // 11 .

}];

}// 14

- (void)hello:(myBlock)hi  // 4. 开始执行这个方法

{

int k = 9 ;  // 5 .

hi(k);      // 6. 这里开始调用hi 这个block快

 NSLog(@"+++>%d",k);//12. 然后在到这里 所以这里是最后一次打印

} // 如果还要继续写当然 这里是13

看下打印结果

2014-09-02 16:39:44.933 calendar[11511:60b] --->9  

2014-09-02 16:39:48.059 calendar[11511:60b] ====>9

2014-09-02 16:39:51.855 calendar[11511:60b] +++>9

我以前一直怀疑block会自动生成一个线程然后在另一个线程中去工作  由上面的执行顺序发现他还是同步的 非常规矩的一步一步的执行  有时候我们在使用block时候

会发现他是异步调用的 这只能说明别的地方使用的时候是异步的 所以回调的时候显得异步  来代码更明显

如果我把这个方法改变成这样

- (void)print:(myBlock)my

{

[self hello:^int(int m) {

NSLog(@"--->%d",m);

[UIView animateWithDuration:1 animations:^{ // 一下想不到什么异步的方法

} completion:^(BOOL finished) {

my(m);

NSLog(@"我在最后执行那就说明block不是异步,不是他干的");

}];

return 2 ;

}];

}

打印结果马上就变成这样  这个时候感觉block本身是异步的 其实不然

2014-09-02 17:00:04.621 calendar[11672:60b] --->9

2014-09-02 17:00:04.670 calendar[11672:60b] +++>9

2014-09-02 17:00:04.914 calendar[11672:60b] ====>9

2014-09-02 17:08:38.898 calendar[11754:60b] 我在最后执行那就说明block不是异步,不是他干的

block 和 多线程没什么关系 所以不认为和 block和GCD 是一回事

然后有这么一种写法 记录下

NSLog(@"%d", ^ (int a){

return  a * a ;

}(5) );

然后block 可能会引起内存泄露

http://www.cnbluebox.com/?p=255  这个写的很详细  还没完全弄懂

block 回调个人理解的更多相关文章

  1. Objective-C中的Block回调模式

    在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...

  2. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  3. Block回调

    •Block的定义   •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现    ...

  4. UIAlertController——之Block回调

    iOS8.0之后出现的提示框 =.=,比自己去改block回调要好.

  5. 第十篇、自定义UIBarButtonItem和UIButton block回调

    // 自定义导航栏左边按钮 self.navigationItem.leftBarButtonItem = [JQBlockedBarButtonItem blockedBarButtonItemWi ...

  6. iOS很重要的 block回调

    刚刚进入ios开发行业,发现开发中要用到大量的block回调,由此可见它的重要性.学习它之前我也是网上找的资料,推荐这篇文章http://blog.csdn.net/mobanchengshuang/ ...

  7. 代码块(Block)回调一般阐述

    本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口 ...

  8. 63.delegate回调 和block回调

    效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...

  9. iOS开发-Block回调

    关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...

随机推荐

  1. CEO 是一家创业公司的天花板

    大家说是不是呢?一秒钟内看到本质的人,和半辈子也看不清一件事本质的人,自然是不一样的命运.

  2. umlの交互图

    版权声明:本文为博主原创文章,若要转载请注明出处!^_^ https://blog.csdn.net/u010892841/article/details/24920155 前面介绍了uml的非常多种 ...

  3. 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP

    需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP 需求:过滤下面这个网页里共723行 校对中里 行数为两位数 ...

  4. Mysql5.6主从复制

    搭建(192.168.1.10 -> 192.168.1.20) 1 master 上执行 阻塞 DMLflush tables with read lock; 记录 File 和 Positi ...

  5. 使用Vue-cli搭建项目与目录详解

    1.介绍 vue-cli这个构建工具大大降低了webpack的使用难度,支持热重载,有webpack-dev-server的支持,相当于启动了一个请求服务器,给你搭建了一个测试环境,只关注开发就OK. ...

  6. C++中定义NULL的头文件

    NULL不是C语言基本类型,其定义在stddef.h文件中,作为最基本的语言依赖宏存在.但是随着C/C++的发展,很多文件只要涉及了系统或者标准操作都会将NULL作为标准宏声明或者包含.所以几乎包含任 ...

  7. rails常用gem

    一,开发模式下 1,better_errors 使用全新的页面替换 Rails 默认的错误页面,显示更多的上下文信息,例如源码 和变量的值:配合binding_of_caller可以执行代码查看变量的 ...

  8. Java集合转有类型的数组之toArray(T[] a)

    在java变成中慎用强制类型转换,尽量使用类自带的转换函数或泛型.先看一行代码 错误方法: String[] array= (String[]) list.toArray(); 如果list中存放的是 ...

  9. JAVA面试题整理(7)-Redis

    Redis面试题汇总 1.Redis用过哪些类型数据,以及Redis底层怎么实现 分析:是不是觉得这个问题很基础,其实我也这么觉得.然而根据面试经验发现,至少百分八十的人答不上这个问题.建议,在项目中 ...

  10. STRIDE 和 DREAD

    目录 STRIDE 和 DREAD 背景 STRIDE DREAD 注释 STRIDE 和 DREAD 背景 STRIDE 和 DREAD 是最常用也是最好用的安全模型 STRIDE 主要负责对安全风 ...