OC中block的理解

### 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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值