Objective-c的内存管理以及Block

1.内存管理

<1>ARC与MRC

当一个对象的引用计数值为0时,它就会被系统自动调用dealloc释放掉。

(1)ARC:自动引用计数

对于strong修饰的对象A,当对象B被对象A引用时,系统会自动给对象B的引用计数+1,当对象A释放后,系统会自动给对象B的引用计数-1。

(2)MRC:手动引用计数

需要手动给引用计数+1(retain)或 -1(release)

<2>strong与weak修饰符

(1)strong

strong修饰的对象A,当它引用别的对象B时,B的引用计数会+1

(2)weak

weak修饰的对象A,当它引用别的对象B时,B的引用计数不会+1

<3>循环引用

当多个对象形成相互强引用闭环时,就会出现内存无法释放的情况。

如A->B->C->D->E->A或A->B->A,此时最简单的方法就是将一者置为weak。

2.Block

<1>block是什么?

从C语言的角度理解,block像是函数类型的变量,它可以自动捕获上下文。

Swift 复制代码
@property (nonatomic, copy) void(^myblock)(void);
self.myblock = ^{
    //这里面是我们的"函数体"
};

(1)前面的void是它的类型,后面的void是它的传参。

(2)copy类似于strong,copy是为了将栈block拷贝到堆区,延长生命周期。

(3)①对于普通变量是值捕获(拷贝值,block内修改不影响原变量)

②__block或是static修饰的变量,为指针捕获,block内可以直接修改原变量

(4)循环引用

block会强引用捕获的对象,如果对象也强引用block,那么就会形成闭环,导致无法释放。

objectivec 复制代码
self.myString = @"Hello, World!";
self.myblock = ^{
    NSLog(@"%@",self.myString);
};

解法:

objectivec 复制代码
self.myString = @"Hello, World!";
__weak typeof(self) weakSelf = self;
self.myblock = ^{
    NSLog(@"%@",weakSelf.myString);
};

我们定一个__weak,弱指针,类型为self,名为weakSelf,指针指向self

此时self->block->weakself->self,会在weakself这里断开。

相关推荐
luj_17688 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏8 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
likeyi079 小时前
require 和 import的区别
开发语言·前端
远离UE49 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬9 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
KaMeidebaby10 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_176810 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
Mininglamp_271811 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native
思麟呀11 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~11 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法