zoukankan      html  css  js  c++  java
  • 关于堆栈和block之我见

    临时变量存在栈里
    对象存在堆里


    关于block

    c与oc最大的区别在于一个是静态语言一个是动态语言

    先看看c 的写法

    void testFunc() {
    printf("hello world");
    }
    
    void testFuncPoint(void) {
    
    void (*x)(void) = testFunc;
    x();
    }
    

    c语言没有block一说,叫做函数指针,其实现机制是,函数入口是固定的,我只要知道函数入口就能正确的调用该函数,
    因此将函数地址赋给函数指针,调用的时候直接使用该指针即可


    再看看 oc
    首先我尝试采用c写法,使用函数指针调用函数

    void (*functionPoint)(void) = sayHello;
    
    ///////////////////////////////////
    - (void)sayHello {
    NSLog(@"hello world!");
    }
    

    实验结果: 语法错误编译器不支持该种语法

    正确写法:

    TestBlock block = ^(int x) {
    x++;
    };
    block(5);
    

    该种写法实现与c有着本质区别, 其本质是将代码拷贝至堆区并保留特定堆区指针,在调用的时候将地址赋给cs:ip寄存器,实现跳转至block的操作。


    分析: oc是门动态语言,采用消息发送机制,函数的执行方法是 先找到对象 -> 读取函数列表 -> 匹配最合适的函数指针 -> 执行
    如果采用c写法,第一必须在编译时确定函数的位置,第二将会破坏oc的这种实现机制
    所以采用block这种设计方式便在情理之中

    附上oc函数结构体

    struct objc_method {
    SEL _Nonnull method_name // 算则子名称
    char * _Nullable method_types // 参数类型
    IMP _Nonnull method_imp // 函数指针
    }
    
  • 相关阅读:
    rsync 安装使用详解
    shell全备份脚本(借鉴别人的,在其基础上修复完善了bug)
    完全备份、差异备份以及增量备份的区别
    云主机格式化和挂载数据盘
    JSONP跨域
    php的多线程使用
    tp其他功能
    Zend Guard Loader和Zend Optimizer的安装(更新中)
    前端编码规范
    前端优化
  • 原文地址:https://www.cnblogs.com/TengSys/p/8227676.html
Copyright © 2011-2022 走看看