block在arc和mrc下的不同点

##Block存储域
根据BLock中是否引用了自动变量,可以将Block存储域分类:

  • NSStackBlock - 存储在栈上
  • NSGlobalBlock - 存储在全局数据区域
  • NSMallocBlock - 存储在堆上

在MRC下

  1. 如果Block没有引用变量 或 在全局作用域的类型为NSGlobalBlock,如下:

     int a = 11;
     void (^block1)() = ^{
         NSLog(@"%d", a);
     };
    	
     int main(int argc, const char * argv[]) {
         @autoreleasepool {
    	        
             void (^block2)() = ^{
                 NSLog(@"%d",1);
             };
    	        
             NSLog(@"block1 = %@ n block2 = %@", block1, block2);
         }
         return 0;
     }
    

    输出日志:

     block1 = <__NSGlobalBlock__: 0x100001080> 
      	block2 = <__NSGlobalBlock__: 0x1000010c0>
    

    通过输出日志能看到,block1和block2都是NSGlobalBlock;其中 block1是在人全局作用域,block2则没有引用变量。

  2. 如果Block引用的自动变量,则类型为NSStackBlock,如下:

     void addBlockToArray(NSMutableArray *arr) {
         int a = 11;
         void (^block)() = ^{
             NSLog(@"%d", a);
         };
    	
         NSLog(@"%@", block);
     }
    	
     int main(int argc, const char * argv[]) {
         @autoreleasepool {
             NSMutableArray *arr = [NSMutableArray array];
             addBlockToArray(arr);
    	        
         }
         return 0;
     }
    

    输出日志:

     block = <__NSStackBlock__: 0x7fff5fbff7f0>
    

在非ARC下,用strong声明的block会copy,用retain声明的block则不会copy。


Creative Commons License
This work is licensed under a CC A-S 4.0 International License.