美文网首页
Block在ARC和MRC分布情况

Block在ARC和MRC分布情况

作者: 贪墨的礼物 | 来源:发表于2018-02-02 15:47 被阅读0次

    =========================test 1===========================

    float (^block1)(float, float) = ^(float a, float b){ return a + b; };
    NSLog(@"====test 1 >> block1 is %@", block1);
        
    NSArray *testArr = @[@"1", @"2"];
    NSLog(@"====test 1 >> block2 is %@", ^{ NSLog(@"testArr :%@", testArr[1]); });
        
    void (^block3)(void) = ^{ NSLog(@"testArr :%@", testArr[1]); };
    NSLog(@"====test 1 >> block3 is %@", block3);
    

    在ARC中打印:

    2018-02-02 10:49:09.316 BlockDemo[859:360563] ====test 1 >> block1 is <__NSGlobalBlock__: 0x1000e00b8>
    2018-02-02 10:49:09.317 BlockDemo[859:360563] ====test 1 >> block2 is <__NSStackBlock__: 0x16fd25ef0>
    2018-02-02 10:49:09.317 BlockDemo[859:360563] ====test 1 >> block3 is <__NSMallocBlock__: 0x15e643e10>
    

    在MRC中打印:

    2018-02-02 11:16:58.335 BlockDemo[862:363874] ====test 1 >> block1 is <__NSGlobalBlock__: 0x1000700a0>
    2018-02-02 11:16:58.335 BlockDemo[862:363874] ====test 1 >> block2 is <__NSStackBlock__: 0x16fd95ef0>
    2018-02-02 11:16:58.335 BlockDemo[862:363874] ====test 1 >> block3 is <__NSStackBlock__: 0x16fd95ec0>
    

    总结:
    /*在ARC中:
    *1.block1没有访问外部变量,block1在NSGlobalBlock
    *2.block2访问了外部变量,block2在NSStackBlock
    *3.block3访问了外部变量,且有赋值操作。block3在NSMallocBlock,因为在ARC中默认是__strong修饰,系统把栈中的block 自动copy到堆中。
    *在MRC中:
    *1.block1没有访问外部变量,block1在NSGlobalBlock
    *2.block2访问了外部变量,block2在NSStackBlock
    *3.block3访问了外部变量,且有赋值操作。但block3在NSStackBlock。因为MRC自动管理内存,系统没有做自动copy操作。
    */

    =========================test 2===========================

    int c = 100;
    int(^block1)(int a, int b) = ^int(int a, int b){ return c+a+b; };
    NSLog(@"====test 2 >> block1 = %@",block1);
        
     __weak int(^block2)(int a, int b) = ^int(int a, int b){ return c+a+b; };
    NSLog(@"====test 2 >> block2 = %@",block2);
    
    __weak int(^block3)(int a, int b) = block2;
    NSLog(@"====test 2 >> block3 = %@",block3);
    

    在ARC中打印:

    2018-02-02 11:28:53.075 BlockDemo[865:365509] ====test 2 >> block1 = <__NSMallocBlock__: 0x126659d80>
    2018-02-02 11:28:53.075 BlockDemo[865:365509] ====test 2 >> block2 = <__NSStackBlock__: 0x16fd95ec8>
    2018-02-02 11:28:53.075 BlockDemo[865:365509] ====test 2 >> block3 = <__NSStackBlock__: 0x16fd95ec8>
    

    在MRC中打印:
    因为mrc中没有__weak,所以block2、block3会编译报错,block1在NSStackBlock中。

    =========================test 3===========================

    NSLog(@"====test 3 >> block1 = %@",[self getMyGlobalBlock]);
    myBlock block2= [self getMyGlobalBlock];
    NSLog(@"====test 3 >> block2 = %@",block2);
    NSLog(@"====test 3 >> block3 = %@",[self getMyMallocBlock]);
    myBlock block4= [self getMyMallocBlock];
    NSLog(@"====test 3 >> block4 = %@",block4);
        
    NSArray *arr = [self getGlobalBlockArray];
    NSLog(@"====test 3 >> block5 = %@",arr[0]);
    myBlock blk0 = (myBlock)arr[0];
    NSLog(@"====test 3 >> block6 = %@",blk0);
    NSLog(@"====test 3 >> block7 = %@",(myBlock)arr[1]);
    myBlock blk1 = (myBlock)arr[1];
    NSLog(@"====test 3 >> block8 = %@",blk1);
    NSArray *arr1 = [self getMallocBlockArray];
    NSLog(@"====test 3 >> block55 = %@",arr1[0]);
    myBlock blk00 = (myBlock)arr1[0];
    NSLog(@"====test 3 >> block66 = %@",blk00);
    NSLog(@"====test 3 >> block77 = %@",(myBlock)arr1[1]);
    myBlock blk11 = (myBlock)arr1[1];
    NSLog(@"====test 3 >> block88 = %@",blk11);
    
    -(myBlock)getMyGlobalBlock
    {
        return ^{printf("add=%d\n",0);};
    }
    
    -(myBlock)getMyMallocBlock
    {
        int add=10;
        return ^{printf("add=%d\n",add);};
    }
    
    -(id) getGlobalBlockArray
    {
        return [NSArray arrayWithObjects:
                ^{NSLog(@"blk0:%d",1);},
                ^{NSLog(@"blk1:%d",2);},nil];
    }
    
    -(id) getMallocBlockArray
    {
        int a =10, b = 100;
        return [NSArray arrayWithObjects:
                ^{NSLog(@"blk0:%d",a);},
                ^{NSLog(@"blk1:%d",b);},nil];
    }
    

    在ARC中打印:

    2018-02-02 14:51:20.594 BlockDemo[921:395069] ====test 3 >> block1 = <__NSGlobalBlock__: 0x1000ac0a0>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block2 = <__NSGlobalBlock__: 0x1000ac0a0>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block3 = <__NSMallocBlock__: 0x154e63930>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block4 = <__NSMallocBlock__: 0x154e63930>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block5 = <__NSGlobalBlock__: 0x1000ac100>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block6 = <__NSGlobalBlock__: 0x1000ac100>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block7 = <__NSGlobalBlock__: 0x1000ac140>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block8 = <__NSGlobalBlock__: 0x1000ac140>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block55 = <__NSMallocBlock__: 0x154e5e760>
    2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block66 = <__NSMallocBlock__: 0x154e5e760>
    (lldb) 
    

    在MRC中打印:

    2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block1 = <__NSGlobalBlock__: 0x10005c080>
    2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block2 = <__NSGlobalBlock__: 0x10005c080>
    2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block5 = <__NSGlobalBlock__: 0x10005c0c0>
    2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block6 = <__NSGlobalBlock__: 0x10005c0c0>
    2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block7 = <__NSGlobalBlock__: 0x10005c100>
    2018-02-02 14:56:06.189 BlockDemo[924:396265] ====test 3 >> block8 = <__NSGlobalBlock__: 0x10005c100>
    (lldb) 
    

    总结:
    /*在ARC中:
    *1.return在栈中的block,无论是否有赋值操作,最终获得block都存在堆中。
    *2.return在全局区的block,无论是否有赋值操作,最终获得block都全局区。
    *3.return数组,数组中如果是全局区的block,最终获得block都全局区。
    *4.return数组,数组中如果是栈中的block,arr[0]保存block在堆中,arr[1]会报错。
    *在MRC中:
    *1.return在栈中的block,编译报错,提示无法返回本地block。
    *2.return在全局区的block,无论是否有赋值操作,最终获得block都全局区。
    *3.return数组,数组中如果是全局区的block,最终获得block都全局区。
    *4.return数组,数组中如果是栈中的block,打印block会报错。
    */

    =========================test 4===========================

    NSString *str = @"test";
    NSLog(@"====test 4 >> 0: %@",^{ NSLog(@"%@", str); });
    myBlock block1 = [self test4];
    NSLog(@"====test 4 >> 1: %@",block1);
    NSLog(@"====test 4 >> 2: %@",[self test4]);
    - (myBlock)test4
    {
        char e = 'E';
        void (^block)() = ^{ NSLog(@"========:%c", e); };
        return block;
    }
    

    在ARC中打印:

    2018-02-02 15:20:24.721 BlockDemo[938:400472] ====test 4 >> 0: <__NSStackBlock__: 0x16fd6df10>
    2018-02-02 15:20:24.721 BlockDemo[938:400472] ====test 4 >> 1: <__NSMallocBlock__: 0x155515240>
    2018-02-02 15:20:24.721 BlockDemo[938:400472] ====test 4 >> 2: <__NSMallocBlock__: 0x155567360>
    

    在MRC中打印:

    2018-02-02 15:25:21.431 BlockDemo[941:401388] ====test 4 >> 0: <__NSStackBlock__: 0x16fd85f10>
    (lldb) 
    

    总结:
    /*在MRC中:
    *return已经赋值的栈中block,编译可以通过,调用会报错。
    */

    扩展

        /*在现在Blocks中,没有实现对C语言数组的截取(ARC和Mrc中编译没法通过),使用指针可以解决问题*/
        char *text = "Hello";
        myBlock block1 = ^{ printf("test 5 >> 0:%c\n",text[0]); };
        block1();
        
        char text1[] = "Hello";
        myBlock block2 = ^{ printf("test 5 >> 1:%c\n",text1[0]); };  //编译报错
    

    相关文章

      网友评论

          本文标题:Block在ARC和MRC分布情况

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