zoukankan      html  css  js  c++  java
  • Objective-C中Block的常见用法

     1 typedef int(^AddValue)(int,int);
     2 
     3 int main(int argc, const char * argv[]) {
     4     @autoreleasepool {
     5         //1:NSStackBlock
     6         __block int curNum = 7;//如果block内想要修改外部声明的局部变量,则需要将该变量声明为__block类型,否则该变量是const类型的,不能再block内修改
     7         int (^testBlock)(void) = ^(void){
     8             curNum++;
     9             return curNum * 4;
    10         };
    11         
    12         NSLog(@"testBlock:%d,curNum = %d",testBlock(),curNum);
    13         
    14         //2:NSGlobalBlock
    15         AddValue addValue = ^(int a,int b){
    16             a = a +b;
    17             return a + b;
    18         };
    19         int a = 3;
    20         int b = 4;
    21         NSLog(@"addvalue : %d  a = %d, b = %d",addValue(a,b),a,b);
    22         
    23         //3
    24         void (^printString)(NSString *);
    25         printString = ^(NSString *str){
    26             NSLog(@"printString:%@",str);
    27         };
    28         printString(@"hello world");
    29 
    30     }
    31     return 0;
    32 }

    打印结果:

    testBlock:32,curNum = 8
    addvalue : 11  a = 3, b = 4
    printString:hello world

    Block分为三种类型:

     *1.NSGlobalBlock:不访问外部变量

     *2.NSStackBlock:位于栈内存,访问结束后释放

     *3.NSMallocBlock:位于堆内存

    Block与方法的区别:

     *1.都有返回值,

     *2.参数列表

     *3.可以保存代码,

     *4.调用方式相同

    可以使用typedof定义Block类型,好处是可以生命多个该Block类型的变量,而传统方式只能声明一个变量。

    注意事项:

     *1.Block可以访问外部变量

     *2.Block内不能修改外部变量的值,除非在外部变量类型前用__block关键字(两个下划线哦)修饰

     *3.copy。在类属性中,要使用copy

     *4.block是Objective-C中的对象,但是跟已定义的类又有所不同,block默认在栈上分配,一般类的实例对象在堆上分配。Block对象在栈上分配,block的引用指向栈帧内存,而当方法调用过后,指针指向的内存上写的是什么数据就不确定了。

  • 相关阅读:
    剑指offer--树的子结构
    剑指offer--合并两个排序的链表
    剑指offer--链表中倒数第k个节点
    剑指offer--反转链表
    JavaScript一个简单的显示隐藏功能
    css之animition动画帧
    css之3D变换
    css之过渡、变换
    css之!important
    分栏
  • 原文地址:https://www.cnblogs.com/calence/p/6739150.html
Copyright © 2011-2022 走看看