Block的注意点

本文深入探讨Objective-C中的Block特性,包括变量访问规则、内外部变量作用域及修改限制,以及Block在栈和堆上的存储机制及其对对象引用的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
//  main.m
//  OC语言学习


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {
   
    //1.block中可以访问外面的变量
    int a = 10;
    void (^myBlock)() = ^{
        NSLog(@"a = %i",a);
    };
    myBlock(); //输出: a = 10
    
    //2.block中可以定义和外界同名的变量
    int a1 = 10;
    void (^myBlock1)() = ^{
        int a1 = 20;
        NSLog(@"a1 = %i",a1);
    };
    myBlock1(); //输出:a1 = 20
    
    //3.默认情况下,不可以在block中修改外界变量的值
    int a2 = 10;
    void (^myBlock2)() = ^{
        NSLog(@"a2 = %i",a2);
    };
    a2 = 20;
    myBlock2(); //输出: a2 = 10
    
    //3.1在block中修改外面变量的值
   __block int a3 = 10;
    void (^myBlock3)() = ^{
        a3 = 50;
        NSLog(@"a3 = %i",a3);
    };
    myBlock3(); //输出:a3 = 50
    
    //4.block是存储在堆中还是栈中?
    
    /*
     默认情况下,block存储在栈中,如果对block进行一个copy操作,block会转移到堆中
     如果block在栈中,block中访问了外界的对象,那么不会对对象进行retain操作
     但是如果block在堆中,block中访问了外界的对象,那么会对外界的对象进行一次retain
     */
    
    //所以,如果在block中访问了外界的对象,一定要给对象加上 __block,只要加上 __block,
    //即使block存储在堆中,也不会对外界的对象进行retain
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值