iOS笔记:第十篇 OC 内存管理

来源:互联网 发布:js slibings 编辑:程序博客网 时间:2024/06/07 23:59




 1.栈、堆
     栈
     1.栈内存是由系统管理的
     2.栈是用来存放局部变量
     3.当代码执行到定义哪一行为这个局部变量分配存储空间
     4.当程序执行到定义变量的代码块结束的时候,就会回收这个变量
     堆:
     1,堆内存是由程序员管理(动态存储区)
     2. OC中的对象时在堆内存中
 
 2.引用计数器:
 OC中每一个对象,都有4个字节存储空间,用来存放引用计数的值
 作用:
    引用计数器的值,就是当前有多少个人在使用对象
    当引用计数器为0时候,系统会立即回收这个对象
 在OC中判断一个对象是否被回收的唯一依据:就是看这个对象的引用计数器是否为0
 
 如何操作引用计数器:
     1.当新创建一个对象的时候,他引用计数器为1(new,alloc,copy,multableCopy)
     2.当给一个对象发送retain消息,它的引用计数器+1
     3.当给一个对象发送release消息,它的引用计算器-1
 
 当一个对象的引用计数器为0时候,系统就会调用dealloc
 作用:1.验证对象是否被回收了
      2.释放对象自己的资源


 当一个对象的引用计数器为0的时候,这个对象就是僵尸对象
 
 3.野指针:
 当一个对象指针指向一个僵尸对象的时候,那么这个指针就是野指针
 当定义一个指针,而这个指针没有进行初始化
 
 操作野指针是非常危险的:1.程序崩溃了 2.数据错误


 4.内存管理是来管理“OC对象”的内存的
 
 内存管理不当造成两个问题:
     一个对象不再使用了,但是依然占据内存,内存泄露
     一个对象正在被使用,但却已经释放了,野指针。
 
 5.空指针:
 nil:OC实例对象的指针指向nil时,这个指针就是一个空指针
 1.给空指针发送消息不会报错 2、它不会去调用方法
 
 当一个指针已经被release了那么还要对该指针做一个清空的操作(person = nil)
 防止后面使用到该指针的时候导致程序崩溃
 
 6.nil ,Nil ,NULL,NSNull的区别
 nil  :OC对象的空指针
 Nil  :OC类对象的空指针
 NULL :C语言的空指针
 NSNull:是一个单例对象,用来在OC的集合中占的位置


 7.内存管理的原则:
     1、当有人使用这个对象就不要释放这个对象
     2、当没有人使用这个对象就释放该对象
 
 8.OC手动内存管理的黄金法则:
 凡是调用alloc,new,copy,multableCopy创建一个新对象或调用retain
 让对象的引用计数+1,都必须相应的调用一次release或者autorelease
 
 9.@property参数
 管理内存
 retain 生产内存管理的代码
 assign 没有内存管理的代码(默认)
 
 当使用OC对象时候,就用retain
 当使用非OC对象(基本数据类型,枚举,结构体)时候,就用assign
 当使用NSString,Block对象时候,就用copy


 控制线程安全
 nonatomic : 非线程安全的,不加锁,速度快(iOS基本都是用这个)
 atomic:线程安全的,加锁,速度慢(默认的)
 
 控制访问权限
 readonly 表示只读,只生成getter方法,不生产setter方法
 readwrite 表示可读写的,既生成getter又生产setter方法
 
 修改getter和setter方法名称
 getter=getter方法的名称
 setter=setter方法的名称:
 
 一般当一个成员变量是BOOL类型时候,需要修改getter方法名称,为is+属性名称首字母大写
 
 10.@class 使用格式
 @lass 类名;
 作用:告诉编译器,@class后面是一个类,但是类中有什么样属性,什么方法都不知道
 
 @class 主要功能就是用来解决循环导入问题
 在头文件中使用@class说明这个类
 如果在实现文件中有用到这个类的方法或属性,就必须在实现文件(.m文件)导入这个类
 
 11.循环retain,导致在环中的所有对象对象都不能释放,(内存泄露)
 解决方法:
 只要环中有一条线用retain的,另一条线是assign
 注意:用assign的一端在重写dealloc方法时不需要给对方的对象做release释放操作
 
 12.autorelease 基本使用
 作用:延迟对象的释放时间
 原理:
 当一个对象调用autorelease时候,就会把这个对象放到自动释放池中,这时候对象应用计数器没有发生改变
 当自动释放池销毁的时候,会对池中所有对象进行一次release操作
 当你给一个对象发送多少次autorelease消息,那么当自动释放池销毁时候,就会相应的调用多少次release
 
 
 
 


1 0