• 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

  • 相关阅读:
    Lua学习笔记(二):基本语法
    Lua学习笔记(一):搭建开发环境
    C#学习笔记(十六):Attribute
    [U3D Demo] 手机FPS射击游戏
    C#学习笔记(十五):预处理指令
    js 树菜单 ztree
    jquery flexslider 轮播插件
    浏览器 本地预览图片 window.url.createobjecturl
    mouseover mouseenter mouseout mouseleave
    jquery checkbox问题
  • 原文地址:https://www.cnblogs.com/yintingting/p/12668936.html
Copyright © 2020-2023  润新知