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