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

  • 相关阅读:
    fetch的优点
    gitignore不起作用
    css动画和js动画区别
    工业家居气象空气环境质量监测仪记录数据甲醛PM2.5二氧化碳大气压温湿度
    摆脱淘宝、京东、拼多多内部引流消费规则,自建网站利用其完成支付
    语音朗读模块TTS文本变量实时转语音朗读科大讯飞XFS5152CE芯片AI
    PCB altium designer AD10 AD20 导出DWG CAD文件 过孔问题
    【Creator3】如何在3D场景中实现炫酷传送门,和简单的小地图功能,RenderTexture技术应用
    B站视频:【Creator3】好玩的编队代码 魔性排列停不下来 附源码及出处
    B站视频:《四图猜词》 Part3 | CocosCreator游戏开发教程
  • 原文地址:https://www.cnblogs.com/studyios/p/3951887.html
Copyright © 2020-2023  润新知