zoukankan      html  css  js  c++  java
  • block 回调个人理解

    在网上见过这么个面试题 

    使用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  这个写的很详细  还没完全弄懂 

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/studyios/p/3951887.html
Copyright © 2011-2022 走看看