美文网首页
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分布情况

    =========================test 1==========================...

  • Blcok相关经典面试题

    题目:事例分析Block在ARC和MRC情况下的使用。 ARC与MRC在Xcode中的切换:arc-->mrc 更...

  • 5.Block的内存管理 内存管理

    内存管理 无论当前环境是ARC还是MRC,只要block没有访问外部变量,block始终在全局区 MRC情况下 b...

  • iOSBlockARC&MRC对比

    前言 默认为MRC 特殊情况会注明ARC模式运行 一、block 我们在Interface 和 implement...

  • Block学习总结(三)

    关于block的存储域 一、 block变量存储域 1. ARC和MRC不同的存储情况 通过对block本质的探究...

  • 关于Block的使用和解决Cycle Retain问题(ARC)

    本文只介绍了ARC时的情况,有些细节不适用于MRC。比如MRC下__block不会增加引用计数,但ARC会,A...

  • Block

    结论: MRC补充: block声明、定义、取别名 传值: 区分MRC和ARC: 循环引用: block值传递 b...

  • Objective-C中Block内存分配全解析

    Block的类 Block分配的规律 Block不论在ARC下还是在MRC下,都会视情况被分配到这三种区中。我总结...

  • 面试题整理

    3. __block在arc和非arc下含义一样吗? 是不一样的。 在MRC中block variable在blo...

  • __weak & __block

    1.__block:可以在ARC、MRC下使用 __weak:只能在ARC下使用 2.__block:可以修饰对象...

网友评论

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

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