zoukankan      html  css  js  c++  java
  • 内存管理

    过渡释放

    现象:当写完和内存引用计数-1有关的操作后,程序马上crash.

    原因:空间被系统回收之后,不能再做和引用计数-1有关的操作,否则马上crash

    解决方式:删除

    当引用计数为零时,系统会自己主动回收内存,我们仅仅管理引用计数.


    野指针异常:

    现象:可能会崩溃,也可能不会崩溃,写到某一行代码时突然崩溃.(没有写不论什么和引用计数相关的代码);

    产生原因:该对象的空间已经被系统回收,不能訪问没有全部权的对象.

    解决方式:空间被系统回收以后,禁止訪问.


    内存泄露:

    现象:系统崩溃

    产生原因:一直开辟空间,而不做空间回收处理.

    解决方式:开辟空间的同一时候就要考虑空间的回收.


    autorelease 会将声明为autorelease的对象放入离它近期的自己主动释放池中,当自己主动释放池销毁时,会向池中的每个对象发送给一个release消息.

    面试题1

        @autoreleasepool {

            for (long i = 0; i < 100000000000; i++) {

                @autoreleasepool{

                    Person *per = [[Person alloc]init];

                    [per autorelease];

                }

            }

        }

    存在的问题:没有优化内存,反复开辟空间,却没有回收空间,会造成内存泄漏


    面试题2

        NSString *per = [[NSString alloc]init];//0 - 1

        [per retain];//1 - 2

        [per retain];//2 - 3

        per = @"aa";

        [per release];

        [per release];

        [per release];

     存在的问题,指针变量重指向,造成内存泄漏,而且后面的空间回收操作无效.

     内存管理基本原则:

     假设你对一个对象进行了alloc,retain,copy之后,你就拥有了该对象的全部权,你就必须对它进行release或者autorelease.

    当该引用对象计数为0时系统会自己主动调用dealloc方法来回收空间.该方法是由系统自己主动调用,不能手动调用.

    验证对象空间有没有回收,仅仅要查看该类的dealloc方法有没有运行就可以.



    内存管理经典分析:

    遛狗原理和关灯原理

  • 相关阅读:
    201671010410 冯婷秀 实验三 作业互评与改进
    读《构建之法》感想
    实验十四 团队项目评审&课程学习总结
    201671010412 郭佳 实验四附加实验
    201671010412 郭佳 英文文本统计分析
    201671010412 郭佳 实验二 软件工程个人项目
    201671010412 郭佳 实验三 作业互评与改进
    在阅读《现代软件工程—构建之法》后的思考问题
    金生芳-实验十四 团队项目评审&课程学习总结
    实验四 附加实验-项目互评
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5061021.html
Copyright © 2011-2022 走看看