iOS-项目开发1-Block

Block回顾

Block分为NSStackBlock, NSMallocBlock, NSGloblaBlock。即栈区Block,堆区Block,全局Block。在ARC常见的是堆块。

在ARC中下面四中情况下系统会将栈区中的Block转移到堆区

1:使用了Copy

2:在一个函数中返回值为Block

3:使用了Strong修饰符

4:在方法名中含有usingBlock的Cocoa框架方法或Grand Central Dispatch 的API中传递Block时。

复制代码
    void(^block)(void)=^{
        NSLog(@"这是Globle Block");
    };
    NSLog(@"%@", [block class]);
    
    int para = 100;
    void(^mallocBlock)(void)=^{
        NSLog(@"这是Malloc Block, para=%d", para);
    };
    NSLog(@"%@", [mallocBlock class]);

    NSLog(@"%@", [^{NSLog(@"这是Stack Block, para=%d", para);} class]);
复制代码
// 输出结果
2019-03-01 16:02:45.571283+0800 RAC[29198:438361] __NSGlobalBlock__
2019-03-01 16:02:45.571395+0800 RAC[29198:438361] __NSMallocBlock__
2019-03-01 16:02:45.571493+0800 RAC[29198:438361] __NSStackBlock__

** Block会自动截获自动变量,在不用__block 修饰变量时,块捕获的变量值不会改变。(可以简单等同于值传递和引用传递)

复制代码
    int para = 100;
    void(^mallocBlock)(void)=^{
        NSLog(@"para=%d", para);
    };
    ++para;
    mallocBlock();
    NSLog(@"para=%d", para);
    
    __block int other = 100;
    void(^otherBlock)(void)=^{
        NSLog(@"para=%d", other);
    };
    ++other;
    otherBlock();
    NSLog(@"para=%d", other);
复制代码
// 输出结果

2019-03-01 16:07:18.299909+0800 RAC[29452:446423] para=100
2019-03-01 16:07:18.300076+0800 RAC[29452:446423] para=101
2019-03-01 16:07:18.300173+0800 RAC[29452:446423] para=101
2019-03-01 16:07:18.300253+0800 RAC[29452:446423] para=101

 

posted @   jisa  阅读(109)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示