iOS开发之Block访问外部变量和循环引用问题

本文探讨了iOS开发中Block如何访问外部变量,解释了为何需要使用__block修饰符以及Block引起的循环引用问题。通过__weak、__block和将self作为block参数来解决循环引用。同时提醒开发者注意block属性应使用copy,特定情况下不会造成循环引用,以及如何避免self在block内提前释放导致的问题。

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

说起Block在iOS开发中作用非常多,用处也非常广。但要用好Block,确保业务逻辑正常,并且内存管理不出问题,也是不简单的。本篇不再阐述Block的概念和语法用法,就Block访问外部变量和循环引用问题来介绍一下。

一、Block访问外部变量

我们先看一个block访问外部变量的例子:

        int a = 10;
        void(^myblock)(void) = ^(void) {
            NSLog(@"a=%d",a);
        };
        a = 20;
        myblock();

结果会发现打印的 a = 10

而且如果试图在block里修改a的值的话,Xcode就会报错,提示在a的定义前添加__block。
按提示修改代码后发现:

        __block int a = 10;
        void(^myblock)(void) = ^(void) {
            NSLog(@"a=%d",a);
        };
        a = 20;
        myblock();

现在打印的就是 a = 20 了。
这是为什么呢?我们把mian.m文件编译成C++代码看一下到底是怎么实现的:

~/Desktop $ clang -rewrite-objc main.m

得到的main.cpp文件,其中main函数编译成了

int main(int argc, const char * argv[]) {

        __attribute__((__blocks__(byref))) __Block_byref_a_0 a = {(void*)0,(__Block_byref_a_0 *)&a, 0, sizeof(__Block_byref_a_0), 10};
        void(*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值