iOS-内存管理
1. alloc, new,copy一个对象时,对象的引用计数为1
引用计数为0时,才能释放
2. retain +1
release -1
retainCount 不准确
3. 对象引用计数为0需要销毁时,系统会调用-(void)dealloc方法,必须先调用[super dealloc]且要写在所有代码后面
4. ARC(Automatic Reference Counting)自动引用计数
编译器会在适当的地方自动添加retain/release方法
MRC(Manul Reference Counting)手动引用计数
5. 关闭ARC
6. 僵尸对象:被释放了的对象
野指针:指向僵尸对象的指针
Enable zoobie objects
7. 全局断点
8. NSLog(@"%s", __func__)
9. 给空指针发送消息是没有任何反应的,不会报错。
10. - (void)setPerson:(Person*)person{
if(_person != person){
[_person release];
_person = [person retain];
}}
- (void)dealloc{
[对象属性 release];/ 对象属性=nil
[super dealloc];
}
11. @property(nonatomic, retain/assign) Person person;
retain : 自动生成内存管理的setter代码
assign : 生成普通的setter/getter代码,不写的话默认是assign
12. import是编译指令,会将""中的文件拷贝到import所在的位置,如果""中的文件发生了改变,那么import就会重新拷贝
Person拥有car, car拥有wheel
car.h import wheel.h, person.h import car.h, 当wheel.h改变时,car.h重新导入wheel.h,那么car.h也改变了,person.h也需重新导入car.h
-》.h中用@类名; .m中import car.h 这样可以减少重新拷贝的次数,提高编译器的效率。也可以解决循环拷贝的问题
13. 循环引用
如果A引用B,B引用A,会造成循环引用.A 调用dealloc时需B release, B release后引用计数为0,调用dealloc需A release. 解决办法:其中一方不要用retain
14. autorelease
[对象 autorelease]会将对象放入自动释放池中,当自动释放池被销毁时,会对所有对象做一次release操作。
[对象 autorelease]返回对象本身。
$$ @autoreleasepool{ //创建一个自动释放池 [对象 autorelease]; } //释放池销毁,给所有对象发送release方法。 或者 $$ NSAutoReleasePool *pool =[ [NSAutoReleasePool alloc]init] [对象 autorelease] [pool release]
不要在释放池中使用占内存比较大的对象!!!!!
如果循环次数很多占内存要这样写:
for ( int i = 0; i < 10000000; i++){ @autoreleasepool{ //这样就能及时释放了 [[[Person alloc]init]autorelease]; }
Foundation框架的类,凡是通过类工厂方法创建的对象都是autorelease的
15. ARC
ARC是编译器特性,是xcode的一个功能,在合适的地方帮你生成retain, release
ARC环境的dealloc方法中不能写[super dealloc]
ARC判断准则:只要没有强指针指向对象,对象就会被释放。
强指针:默认情况下所有的指针都是,或用__strong修饰的
若指针:__weak修饰的指针
ARC中@property中用strong, 不用retain
解决循环引用:一方用strong, 一方用weak