Block在ARC和MRC分布情况

=========================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]); };  //编译报错
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容