首页 > 代码库 > 内存管理

内存管理

过渡释放

现象:当写完和内存引用计数-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方法有没有执行即可.



内存管理经典分析:

遛狗原理和关灯原理