关于block总结

关于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总结)