zoukankan      html  css  js  c++  java
  • 内存管理常用知识点总结

    int  类型数据   占4个字节

    指针数据占8个字节

    栈里面的变量是会自动释放,堆里面的内存不会自动释放所以内存管理只管理OC对象。

    ——基本数据类型占的字节数固定,对象数据类型占的字节大小不固定

    ——程序执行完毕后,栈内存会自动释放,堆内存不会自动释放,所以要对OC对象进行内存管理

    引用计数器是一个在OC对象内部的一个int类型的变量,

    只要使用了alloc 、new、 copy 这些创建一个对象时,这个对象的引用计数器就是1。

    对象一旦创建好,默认引用计数器就是1

    内存管理的本质是:通过操作对象的引用计数器来间接控制对象是否被释放。

    dealloc方法是一个对象即将被销毁时候由系统调用的。在MRC中我们可以重写这个方法,

    要注意:重写dealloc方法时候一定要调用[super   dealloc];  而且在写在最后面调用。

    **********************

    1、僵尸对象:已经销毁,不能再被使用的对象就是僵尸对象。(当访问僵尸对象,会报告“坏访问”)错误。

    2、野指针:指向僵尸对象的指针就是野指针。(会报告“坏内存访问”错误)。

    3、空指针:不指向任何对象的指针就是空指针。比如:NSString *str = nil;  就是空指针。

    4、空指针的地址是0,对象时nil。野指针的地址是一个真实存在的地址,不过里面的对象已经被释放。

    5、为了避免出现野指针错误,在对象被销毁之后,将指向对象的指针变成nil。

    6、在出现多重赋值时候,要release旧值,retain新值。再把新值赋值给属性的成员变量。

    7、在多重赋值的时候,如果赋值对象一直都是旧值,那么就不执行任何操作。

    8、所以结合6和7,在给对象的某一个属性赋值时,要在属性的set方法中先进行判断:要赋的值是新值还是旧值。

           如果是旧值,就什么都不做。如果是新值,就先release旧值,再retain新值。

    9、内存管理原则:谁创建,谁release。谁retain,谁release。

    使用@class可以不用引用一个头文件下的东西,这样可以节约编译时间。

    使用#import就是把这个头文件下的所有内容都拷贝到引用它的地方,在编译的时候比较耗费时间。

    所以建议使用@class,减少编译时间。还可以避免循环引用。

    自动释放池:当调用了[p1    autorelease]; 之后, p1对象的引用计数还是没有没有变化的 ,只是把这个对象

    放到了自动释放池中。当自动释放池被销毁前,会对池子中的所有autorelease对象都做一次release操作,对象被释放

    使用自动释放池,严禁把一个对象使用多次autorelease。否则会报僵尸对象错误。

    自动释放池是以栈的结构进行管理的,栈是先进后出。

    ARC是编译器自动添加内存管理代码。MRC是手动的内存管理,需要手动的来管理对象的内存。

    ARC和其他语言的“垃圾回收机制”不同。ARC:编译器特性。“垃圾回收”运行时特性。

    在ARC中可以调用dealloc方法,但是不能写 [super  dealloc];

  • 相关阅读:
    一个滑动小块
    js 封装的函数 总结
    引用公用文件
    静态页面表单中js验证
    linux中Firefox浏览器 手动安装 flash
    将双击“root的主文件”弹出的窗口设置为文件浏览器
    eclipse中的aptana插件的安装
    System Center VMM请注意不同语言版本的差异
    CodeFirst模式开发涉及到mysql简单使用
    Echarts的使用
  • 原文地址:https://www.cnblogs.com/fs-ios/p/4704497.html
Copyright © 2011-2022 走看看