zoukankan      html  css  js  c++  java
  • block内部实现原理(二)

    block内部实现原理(一)

    【block 在MRC下实现】

    首先定义了三个方法

    分别看下输出的值有什么不同,毫无疑问

    分别来看下在-rewrite-objc选项编译下m值的变化:

    1. test1

    2. test2

     

    3. test3

    注意标红线部分,test1,是直接传递的m的值,而test2,test3 则传递的是&m 也就是m的函数地址。

    test1中比之前的简单block,可以看出这次的block结构体__main_block_impl_0多了个成员变量m,用来存储使用到的局部变量m(值为10);并且此时可以看到__cself参数的作用,类似C++中的this和Objective-C的self

    test2使用了__block类型标识符,test2相比test1、test3,多了__test2_block_copy_0、__test2_block_dispose_0 方法

    所以由于block也是NSObject,我们可以对其进行retain操作。不过在将block作为回调函数传递给底层框架时,底层框架需要对其copy一份。比方说,如果将回调block作为属性,不能用retain,而要用copy。我们通常会将block写在栈中,而需要回调时,往往回调block已经不在栈中了,使用copy属性可以将block放到堆中。或者使用Block_copy()和Block_release()。

    test3使用了static标识符,上面中间代码片段与test1的差别主要在于main函数里传递的是m的地址(&m,以及__main_block_impl_0结构体中成员i变成指针类型(int *)。

    然后在执行block时,通过指针修改值。

    当然,全局变量、静态全局变量都可以在block执行体内被修改。更准确地讲,block可以修改它被调用(这里是__main_block_func_0)时所处作用域内的变量。比如一个block作为成员变量时,它也可以访问同一个对象里的其它成员变量。

    未完待续

  • 相关阅读:
    Linux shell 学习总结
    linux shell 比较总结
    NSURL基本操作 HA
    Mac node.js install HA
    nodejs学习资料收集 HA
    xcode技巧 HA
    google web app/enxtions 学习资料收集 HA
    Failed to upload *.app on Device 可能的解决方法 HA
    iphone开发常见问题小集2 HA
    cocos2d收集 HA
  • 原文地址:https://www.cnblogs.com/yoon/p/4953792.html
Copyright © 2011-2022 走看看