码迷,mamicode.com
首页 > 移动开发 > 详细

作为一个iOSCoder应该知道的 不定期更新

时间:2017-12-18 18:40:16      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:ext   重复   避免   地址   set   内存   initial   reference   text   

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会在第一次调用类的类方法或实例方法之前被调用。这两个方法是可选的,且只有在实现了它们时才会被调用。 
共同点:两个方法都只会被调用一次。可以把一次性设置的东西卸写在这两个方法中;



作为一个iOSCoder应该知道的 不定期更新

标签:ext   重复   避免   地址   set   内存   initial   reference   text   

原文地址:http://www.cnblogs.com/saiyaren/p/8057555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!