码迷,mamicode.com
首页 > 其他好文 > 详细

关于堆栈和block之我见

时间:2018-01-07 14:10:53      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:cti   存在   c语言   动态语言   cpp   发送   静态   har   nslog   

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


关于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 // 函数指针
}

 

关于堆栈和block之我见

标签:cti   存在   c语言   动态语言   cpp   发送   静态   har   nslog   

原文地址:https://www.cnblogs.com/TengSys/p/8227676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!