1. what is ARC ?
ARC: automatic reference counting自动引用计数。
简单点说就是系统在适当的地方自动给对象加减引用计数,当retain count == 0 时 销毁;
那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。 (从知乎上看到,个人感觉知识MRC比较繁琐,又容易比较出错,感觉下面答案还是知道的太浅)
MRC下内存管理的缺点:
1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
2.释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放)
3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
4.多线程操作时,不确定哪个线程最后使用完毕。
另外关于ARC的autoreleasepool
程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
autoreleasepool一般在位置长度的循环中使用,目前项目中还没有用到.
曾经在YYCache中看到这么一句:
@autoreleasepool {
for (int i = 0; i < count; i++) {
[pin setObject:values[i] forKey:keys[i]];
}
}
2. 关于assign和weak
__block vs __weak
assign一般用来修饰基本数据类型,也可以来修饰对象;
weak一般用来修饰对象;
assign可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。
首先__block是用来修饰一个变量,这个变量就可以在block中被修改
__block:使用__block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 __weak typedof(self)weakSelf = self;
3.+(void)load; +(void)initialize;有什么用处?
在Objective-C中,runtime会自动调用每个类的两个方法。+load会在类初始加载时调用,+initialize会在第一次调用类的类方法或实例方法之前被调用。这两个方法是可选的,且只有在实现了它们时才会被调用。
共同点:两个方法都只会被调用一次。可以把一次性设置的东西卸写在这两个方法中;