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

posted @ 2020-04-09 19:04  Emyin  阅读(127)  评论(0编辑  收藏  举报