iOS开发揭秘:__block与__weak修饰符的区别大解析
在iOS开发中,`__block`和`__weak`都是用于变量修饰的特殊关键字,它们都可以用来解决变量循环引用的问题,防止出现内存泄漏。但是它们的使用场景和作用是有区别的。 1. `__block`: `__block`关键字可以用于修饰变量,表示这个变量可以在其作用域内被改变。在ARC(自动引用计数)中,`__block`修饰的变量可以改变其引用计数,即使在Block内部,也可以改变基本数据类型的引用计数。 例如: ```objective __block int a = 10; // 定义一个__block类型的变量a dispatch_async(dispatch_get_main_queue(), ^{ a = 20; // 在Block内部改变a的值 }); NSLog(@"%ld", (long)a); // 输出20,证明在Block内部改变了a的值 ``` 2. `__weak`: `__weak`关键字也可以用于修饰变量,但是它表示这个变量是弱引用,即这个变量可以被nil,当这个变量不再被使用时,其引用计数将会减一。`__weak`主要用于解决循环引用的问题,以防止出现内存泄漏。 例如: ```objective __weak typeof(self) weakSelf = self; // 定义一个__weak类型的self变量 dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf doSomething]; // 在Block内部使用weakSelf代替self,防止出现循环引用 }); ``` `__block`和`__weak`都可以用于修饰变量,但是它们的作用和使用场景是不同的。`__block`主要用于在Block内部改变变量的值,而`__weak`主要用于解决循环引用的问题,以防止内存泄漏。 ######[AI写代码神器 | 392点数解答 | 2023-11-09 17:38:37]
- 代码优化:提升“生命值监控模块”代码的健壮性与性能 (阿里通义 | 721点数解答 | 2024-10-19 15:16:56)301
- C++开发必知:new int[10] 与 new int[10]() 的关键区别 (阿里通义 | 196点数解答 | 2023-11-09 00:45:31)327
- C++游戏代码中枚举类型定义报错原因及解决方案(字节豆包 | 371点数解答 | 2026-02-27 20:29:12)27
- iOS开发:weak关键字使用场景及与assign的差异揭秘(阿里通义 | 311点数解答 | 2023-11-08 00:37:04)277
- iOS开发:让自定义类使用copy修饰符及重写带copy关键字setter的方法(阿里通义 | 268点数解答 | 2023-11-08 00:37:40)252
- iOS开发:Objective - C中weak与assign关键字的使用场景及差异揭秘(百度文心 | 360点数解答 | 2023-11-09 17:38:45)353
- Objective - C:让iOS开发中的类使用copy修饰符的详细指南(百度文心 | 324点数解答 | 2023-11-09 17:38:51)231
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)284
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)312
- Javascript开发必知:jQuery中$.get()与$.post()的六大区别(阿里通义 | 341点数解答 | 2023-11-09 01:15:01)306
- PHP开发必知:isset() 与 empty() 函数的区别解析(百度文心 | 340点数解答 | 2023-11-09 17:57:11)316
- Linux开发必知:which与whereis命令查找文件的区别大揭秘(百度文心 | 193点数解答 | 2023-11-09 18:46:52)337