关于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>
}
网友评论