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这里断开。