美文网首页
关于block总结

关于block总结

作者: finn90 | 来源:发表于2018-06-26 13:55 被阅读0次

    关于block总结

    block有三种:

    NSGlobalBlock 静态区(全局区)block,这是一种特殊的bloclk,因为不引用外部变量而存在。另外,作为静态区的对象,它的释放是有操作系统控制的,这一点我们最后再聊。 

    NSStackBlock 栈区block,位于内存的栈区,一般作为函数的参数出现。 

    NSMallocBlock 堆区block,位于内存的堆区,一般作为对象的property出现。

    如果一个blcok引用了外部变量是栈block,则其不引用外部变量就成为了静态blcok。 

    如果一个block引用了外部变量是堆block,则其不引用外部变量就成为了静态block。

    一、声明一个block

    1.不引用任何外部变量(block外部的局部变量)block存放在内存的数据区域(.data区域)GlobalBlock

    eg:

    - (void)globalBlockTest {

             NSLog(@"%@", ^(){

                  NSLog(@"hello world...");

            });

    }

    输出: <__NSGlobalBlock__: 0x101796120>

    2.若在block内部引用其外部变量(局部变量),那么该block存放在内存栈区 stackBlock

    eg:

    - (void)stackBlockTest {

    NSString *str = @"hello";

    NSLog(@"%@", ^(){

          NSLog(@"%@", str);

        });

    }

    输出: <__NSStackBlock__: 0x7ffeef2e1480>

    3.若声明一个block属性,并且定义该block

    eg:

    - (void)mallocBlockTest {

    //1.若没有引用block外部的局部变量,block存放在内存的数据区域(.data区域)GlobalBlock

    self.block = ^(){

    NSLog(@"hello world...");

    };

    输出: <__NSGlobalBlock__: 0x1047390f0>

    //2.若block引用了外部的局部变量,block被拷贝到堆区 mallocBlock

    NSString *str = @"hello world";

    self.block = ^(){

    NSLog(@"%@", str);

    };

    输出: <__NSMallocBlock__: 0x608000246870>

    }

    二、若block引用全局的变量,则block存放在数据区域(.data区域)GlobalBlock

    eg:

    @property(noatomic, copy) NSString str;

    - (void)testBlock {

    self.str = @"hello world";

    self.block = ^() {

    NSLog(@"%@",self.str);

    };

    NSLog(@"%@", self.block);

    NSLog(@"%@", ^() {

    NSLog(@"%@",self.str);

    });

    输出: <__NSGlobalBlock__: 0x104880128>

      <__NSGlobalBlock__: 0x1048800e8>

    }

    相关文章

      网友评论

          本文标题:关于block总结

          本文链接:https://www.haomeiwen.com/subject/qfzpyftx.html