zoukankan      html  css  js  c++  java
  • iOS Block总结

    1. 作为属性而存在的Block

    testBlock.m文件里

    @property (copy, nonatomic) void (^aBlock)();  // MRC下,block属性必须是显式标注copy策略;  ARC下,其实可以不显式标明copy, xcode会自动对block属性采取copy策略

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.aBlock = ^{

        NSLog(@"%@",self);

      };

    }

    当block在栈内存时,Block对内部的对象只是弱引用 

      1.1 copy关键字

        block默认是在存储在栈内存, 经过copy,会将block复制到堆内存

     

    2. 在方法内部的Block

    - (void)viewDidLoad {

        [super viewDidLoad];

        void (^innerFunctionBlock)() = ^{

            NSLog(@"方法内部的block, 有人管这叫内联Block");

        };

        innerFunctionBlock();

    }

     

    3. 其他

    - (void)viewDidLoad { ...2.里的代码块... }

    void (^block)() = ^{

      NSLog(@"类似全局变量的Block, 其实和方法差不多");

    };

     

    总结: 1. 如果没有对block做copy操作, block就存储于栈内存

            2. 如果对block做copy操作, block就存储于堆内存

            3. 如果block存储于栈空间, 对block内部的所用到的外部对象,是弱引用

            4. 如果block存储于堆空间, 对block内部的所用到的外部对象,是强引用

            5. 解除循环引用的方法: 5.1 ARC:使用 __weak, 有时不能用__weak,那就用 __unsafe_unretained , 这种情况极少发生

                  5.2 MRC:使用__block

                                            5.3 在调用完block之后,将block = nil

            6.  NSInteger a = 1;  

         void (^testBlock)(void) =  ^{

            NSLog(@"a=%d",a);

         };

         ++a;

         testBlock();

                打印出来肯定还是1, 因为block在编译阶段就确定了, 编译的时候block内部的 NSLog(@"a=%d",a)  等价于  NSLog(@"a=%d",1) 

         想要block内部的a是引用,需要用到__block声明变量a: __block NSInteger a = 1;  这样编译编辑阶段,block内部的 NSLog(@"a=%d",a)  等价于  NSLog(@"a=%d",*(&a))

        7.  不要迷信xcode能帮你检查出所有block的循环引用问题,xcode只能检查出比较浅显的,这个尤其需要注意

  • 相关阅读:
    安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
    脱掉360奇虎的“加固保”壳后的发现与你的微信安全
    android 发送http请求
    mysql sql优化
    hdu 1548 A strange lift
    【转】vc中使用SendMessage正确发送自定义消息的方法--不错
    【转】各种常用浏览器“兼容性视图”设置方法
    IE 弹出"Unable to do xml/xsl" Processing
    【转】MFC界面更新实现方法
    【转】怎么在Foxmail回复/转发时使用签名?
  • 原文地址:https://www.cnblogs.com/oumygade/p/4890278.html
Copyright © 2011-2022 走看看