block的了解和相关用法解析学习


一、block基础知识了解

block是一个代码块,ios4.0和Mac OSX10.6引入的新特性,可以极大的简化代码,减少对代理的依赖,以写出更加简洁可读性更强的代码。

block是一个特殊的oc对象,它建立在栈上而不是堆上,这么做一个是为性能考虑,另一个就是为了方便访问局部变量。默认情况下block使用的局部变量都会被复制copy而不是保留,所以它无法改变局部变量的值,如果在变量前面加上__block,那么编译器不会复制变量,而是去找变量的地址,通过地址来访问变量,其实就是直接操作变量本身。由于block是在栈上分配的,如果一旦离开作用域它就会被释放,所以如果你想把block用到别的地方,你必须复制一份,即copy。如在属性的定义中,必须这样写@property(nonatomic,copy) void (^block) NSString *string;  因为block是不能被保留的,所以retain是没有意义的。

内联执行的时候还能传递参数,block本身也可以作为参数在方法和函数间传递,传递给其他函数或者block,这就给了block很大的方便。

OC是对C语言的扩展,block的实现是基于指针和函数指针。对这个首先要了解下闭包的概念,闭包是一个函数或指向函数的指针,再加上该函数执行的上下文变量(有时候称为自由变量)这个很抽象很难理解。其他的人对闭包的解释是:闭包是能够读取其他函数内部的变量。通常我们要获取函数内部的变量,在本质上,闭包就是将函数内部和外部联系起来的一座桥梁。


二、block的简单使用

这里应用其他的作者的技术博客的东西 博客链接 http://www.dreamingwish.com/article/block介绍(一)基础.html

  1、来看一个简单的例子

    int multiplier = 7;
    int(^myBlock)(int) = ^(int num) {
    return num * multiplier;
   };

在这个例子中,myBlock是一个block变量,接受一个int的参数,返回一个int参数。

2、我们再看typedef
typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
typedef int (^IntBlock)(void);//一个没有参数,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block

3、 我们来看一下block的主动调用

- (void)someMethod
{
BoolBlock ablock = ^(BOOLbValue) {
NSLog(@"Bool block!");
};
ablock();
}

4、接下来我们看一下block作为参数返回
typedefvoid (^BoolBlock)(BOOL);
- (BoolBlock)foo()
{
BoolBlock ablock = ^(BOOLbValue) {
NSLog(@"Bool block!");
};
return[[ablock copy]autorelease];
//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
}
5、类的成员函数
@interfaceOBJ1 :NSObject
@property(nonatomic,copy)BoolBlock block;
//理由同上啊,同学们
@end

OBJ1 *obj1 = ...
obj1.block = ^(BOOLbValue) {
NSLog(@"Bool block!");
};

       6、其他函数的参数

       - (void)foo(BoolBlock block)
       {
            if(block) {
                  block();
            }
       }

      7、其他block的参数

      BoolBlock bBlock = ^(BOOLbV){if(Bv){/*do some thing*/}};
      HugeBlock hBlock = ^(BoolBlock bB) {bB();};

      hBolck(bBlock);

      8、全局变量

      static int(^maxIntBlock)(int,int) = ^(inta, intb){returna>b?a:b;};
      int  main()
      {
              printf("%d\n", maxIntBlock(2,10));
              return0;
      }

      9、特殊的标记

     如果block内修改block外的声明的栈变量,一定要对该变量加__block标记     

      int main()
      {
            __block int i = 1024;
           BoolBlock bBlock = ^(BOOLbV) {
                if(bV) {
                       i++;//如果没有__block标记,是无法通过编译的。
                 }
           };
     }

本文非完全原创,参考文献

http://www.cnblogs.com/ymonke/p/3511304.html

http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/

http://www.dreamingwish.com/article/block介绍(一)基础.html

http://www.raywenderlich.com/zh-hans/18753/如何在-ios-5-中使用-block-2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值