### Block学习
##Block内存模型
#Class指针 isa:
1.在Objective-C中,任何类的定义都是对象。类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。
2.类是一个 objc_class 结构类型的指针, id是一个 objc_object 结构类型的指针.
3.isa指针概念:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的指针, 指向meteClass(元类)。元类保存了类方法的列表。当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。
同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向的是一个根元类(root meteClass).根元类的isa指针指向本身,这样形成了一个封闭的内循环。
super_class:父类,如果该类已经是最顶层的根类,那么它为NULL。
version:类的版本信息,默认为0
info:供运行期使用的一些位标识。
instance_size:该类的实例变量大小ivars:成员变量的数组。
4.每一个对象本质上都是一个类的实例。其中类定义了成员变量和成员方法的列表。
对象通过对象的isa指针指向类。每一个类本质上都是一个对象,类其实是元类(meteClass)的实例。元类定义了类方法的列表。
类通过类的isa指针指向元类。
所有的元类最终继承一个根元类,根元类isa指针指向本身,形成一个封闭的内循环。
#函数指针
1.函数指针fun就是block的执行函数。
#变量池
1.变量池中保存的都是block函数中所用到的变量的指针地址,例如block函数体中调用了self得某个方法,则变量池中就是保存指向self的指针。
这个内存模型和常规的对象模型又不太一样,所以我将block理解成为只含有一个方法的对象,切对象中得变量是动态增加,减少的。
block在程序中作用非常大,一般我在编程用得最多的就是在http请求中,因为网络请求是一个异步执行的过程,当网络请求成功(失败)时,就会调用相应的block函数
##Block用法
#定义:*returnType (^blockName)(parameter){}*
使用用例:
*int (^max)(int a,int b);
//给这个block赋值
max = ^(int a,int b)
{
return a>b?a:b;
}
//使用block
int m = max(3,5) //m=5*
如果需要在block内改变外部变量的数值,则外部变量必须在定义时,前面加上__block关键字
*__block int amount = 0;
void (^addAmount) = ^{
amount += 1;
}
NSLog(%d,amount) //amount = 1;
//如果不加__block关键字,则数值在block内无法改变*
//使用方法
*__weak id weakSelf = self;
void (^someBlock) = ^{
[weakSelf someMessage];
}*
someBlock();
转载:
作者:程小龙
来源:CSDN
原文:https://blog.csdn.net/becomedragonlong/article/details/40041617